暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库小工具 DbTool

amazingdotnet 2021-04-06
1612

数据库小工具 DbTool

Intro

DbTool
一个支持 DbFirst
ModelFirst
CodeFirst
的数据库小工具。

DbFirst
是根据数据库中的表信息生成代码中的 Model,以及生成数据表结构文档

ModelFirst
是根据数据表信息或者数据表结构文档生成创建数据库的脚本

CodeFirst
是指根据 model 代码生成数据库表结构信息以及创建数据表的 SQL 脚本

Features

1.5.0 版本新增加了数据库 PostgreSql
的支持,这也是支持 PostgreSql
的第一个版本,应该会有一些问题,如果有遇到问题,欢迎提 issue 反馈哈

除此之外,新版本对于扩展性方面做了一些改善和增强,增加了更多的扩展点

  1. 扩展数据库支持,实现 IDbProvider
    ,实现自己的数据库逻辑或者增加其他数据库的支持
  2. 扩展文档导出支持,实现 IDbDocExporter
    ,将数据库表信息导出到文档,默认支持了 Excel 导出,可以自己扩展其他的导出方式
  3. 扩展文档导入支持,实现 IDbDocImporter
    从数据库文档中获取数据库表信息,默认从 Excel 导入也可以自己扩展其他导入方式
  4. 扩展 Model 代码生成方式,实现 IModelCodeGenerator
    ,根据数据库表信息生成代码 Model,默认支持 C# 代码生成,也可以实现其他代码的生成
  5. 扩展从 Model 代码中获取数据表信息,实现 IModelCodeExtractor
    ,默认从 C# 代码中获取数据表信息,也可以实现从其他代码中获取数据库表信息
  6. 扩展 Model 名称表名称转化,实现 IModelNameConverter
    ,也可以继承 DefaultModelNameConverter
    ,改写某一个实现,实现一些特殊的名称转换,比如 TBL_Notice
    => Notice

插件开发指南

新建一个类库项目,引用 DbTool.Core
,并实现相应的接口,实现对应的逻辑,将生成的 dll
放在 DbTool
plugins
目录下即可

举个例子,自定义一个 Markdown Exporter 插件

  1. 新建一个项目 DbTool.DbDocExporter.Markdown
    ,并引用 DbTool.Core
  2. 添加 MarkdownDbDocExporter
    类并实现 IDbDocExporter
    接口
  3. dotnet build
    生成 dll
    ,并将生成的 dll
    放在 plugins
    目录下

插件化实现方式

通过扫描 plugins
目录,加载 dll
插件到默认的 AssemblyLoadContext
中,并注册需要的服务

var pluginDir = ApplicationHelper.MapPath("plugins");
if (Directory.Exists(pluginDir))
{
    // load plugins
    var plugins = Directory.GetFiles(pluginDir)
        .Where(_ => _.EndsWith(".dll", StringComparison.OrdinalIgnoreCase))
        .ToArray();
    if (plugins.Length > 0)
    {
        var assemblies = plugins.Select(AssemblyLoadContext.Default.LoadFromAssemblyPath).ToArray();
        var exportedTypes = assemblies
            .Select(x => x.GetExportedTypes())
            .SelectMany(t => t)
            .Where(t => !t.IsInterface && !t.IsAbstract)
            .ToArray();
        var pluginTypes = exportedTypes
            .Where(t => interfaces.Any(i => i.IsAssignableFrom(t)))
            .ToArray();
        foreach (var type in pluginTypes)
        {
            services.RegisterTypeAsImplementedInterfaces(type);
        }

        // load service modules
        services.RegisterAssemblyModules(assemblies);
    }
}

对于 UI 界面,会动态添加一些 Button
并绑定相应的处理方法,实现代码大致如下:

var codeGenerators = DependencyResolver.ResolveServices<IModelCodeGenerator>();
foreach (var generator in codeGenerators)
{
    var button = new Button()
    {
        Content = $"{_localizer["Export"]} {generator.CodeType} Code",
        Tag = generator,
        MaxWidth = 180,
        Margin = new Thickness(4)
    };
    button.Click += ExportModel_Click;
    ModelCodeGeneratorsPanel.Children.Add(button);
}

More

更多实现细节以及功能可以自己尝试一下,看看源码,除了开发插件,你也可以直接修改源代码来实现自己想要的功能哈~

References

  • https://github.com/WeihanLi/DbTool/blob/packages/README.md
  • https://github.com/WeihanLi/DbTool
  • https://github.com/WeihanLi/DbTool/blob/wpf-dev/src/DbTool/App.xaml.cs
  • https://github.com/WeihanLi/DbTool/blob/wpf-dev/src/DbTool/MainWindow.xaml.cs


文章转载自amazingdotnet,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论