数据库小工具 DbTool
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 pluginsvar 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 modulesservices.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