Intro
DbTool
一个支持 DbFirst
、ModelFirst
和 CodeFirst
的数据库小工具。
DbFirst
是根据数据库中的表信息生成代码中的 Model,以及生成数据表结构文档
ModelFirst
是根据数据表信息或者数据表结构文档生成创建数据库的脚本.
CodeFirst
是指根据 model 代码生成数据库表结构信息以及创建数据表的 SQL 脚本
Features
1.5.0 版本新增加了数据库 PostgreSql
的支持,这也是支持 PostgreSql
的第一个版本,应该会有一些问题,如果有遇到问题,欢迎提 issue 反馈哈
除此之外,新版本对于扩展性方面做了一些改善和增强,增加了更多的扩展点
-
扩展数据库支持,实现 IDbProvider
,实现自己的数据库逻辑或者增加其他数据库的支持 -
扩展文档导出支持,实现 IDbDocExporter
,将数据库表信息导出到文档,默认支持了 Excel 导出,可以自己扩展其他的导出方式 -
扩展文档导入支持,实现 IDbDocImporter
从数据库文档中获取数据库表信息,默认从 Excel 导入也可以自己扩展其他导入方式 -
扩展 Model 代码生成方式,实现 IModelCodeGenerator
,根据数据库表信息生成代码 Model,默认支持 C# 代码生成,也可以实现其他代码的生成 -
扩展从 Model 代码中获取数据表信息,实现 IModelCodeExtractor
,默认从 C# 代码中获取数据表信息,也可以实现从其他代码中获取数据库表信息 -
扩展 Model 名称表名称转化,实现 IModelNameConverter
,也可以继承DefaultModelNameConverter
,改写某一个实现,实现一些特殊的名称转换,比如TBL_Notice
=>Notice
插件开发指南
新建一个类库项目,引用 DbTool.Core
,并实现相应的接口,实现对应的逻辑,将生成的 dll
放在 DbTool
的 plugins
目录下即可
举个例子,自定义一个 Markdown Exporter 插件
-
新建一个项目 DbTool.DbDocExporter.Markdown
,并引用DbTool.Core
-
添加 MarkdownDbDocExporter
类并实现IDbDocExporter
接口 -
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
更多实现细节以及功能可以自己尝试一下,看看源码,除了开发插件,你也可以直接修改源代码来实现自己想要的功能哈~