.NET CORE数据库小工具DbTool

Intro

DbTool 一个支持 DbFirstModelFirst 和 CodeFirst 的数据库小工具。

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

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

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

Features

.NET CORE数据库小工具DbTool

.NET CORE数据库小工具DbTool

.NET CORE数据库小工具DbTool

.NET CORE数据库小工具DbTool

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 目录下

.NET CORE数据库小工具DbTool

.NET CORE数据库小工具DbTool

.NET CORE数据库小工具DbTool

插件化实现方式

通过扫描 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

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