- 介绍
- 关于AbpHelper.GUI
- 关于AbpHelper.CLI
- 源代码的更改和测试
- 模板类修改
- 解析类修改
- 模板修改
- 生成的**Nuget**包的安装
- 举个栗子
- 总结
Abp Vnext现在也是 .net core
中很流行的DDD框架,而且社区也很活跃,版本在持续的更新中。现在很多公司的招聘中也都开始要求会abp
、.net core
了,所以学习一下很有必要。当然这篇文章不是为了介绍Abp Vnext的相关知识的,主要是为了介绍EasyAbp
社区中提供的代码生成工具。
这里要说明的是,代码工具分为命令行工具(AbpHelper.CLI
)和有界面操作(AbpHelper.GUI
)的两种,而有界面的代码生成器工具是依赖命令行工具的,主要是方便操作,对于不喜欢或者不习惯命令行的攻城狮很有帮助。
它们的github地址:
- https://github.com/EasyAbp/AbpHelper.CLI
- https://github.com/EasyAbp/AbpHelper.GUI
通过上面地址的Realease
可以下载已经打包好的文件进行安装使用,也可以通过Tag
查看当前的最新版本及说明。
编写此文章时,AbpHelper.GUI
的最版本是0.7.0
我们先看看此工具的操作界面,如下
通过此工具,我们可以很方便的创建项目解决方案、安装CLI、生成指定代码等等。其中,我用的比较多的也就是创建项目以及CRUD
生成代码部分。
建议的方式是直接在github上的Realease
中下载可执行文件安装即可使用。
如果非要自己源码生成,可以通过下面的命令完成。
// 依赖包的安装,其中electron相关文件的安装特别满,建议找个好的网络下载
npm install
// 执行electron打包为exe文件
npm run-script package
在生成的dist
文件夹下可以看到生成exe文件
总体来说,这部分相对简单。当然,如果你要研究源代码的话,另当别论。
关于AbpHelper.CLI重点说明此部分的内容,因为更改的地方比较多,记下来方便以后查找使用,也可分享给更多想要了解abp
使用的攻城狮。
如果有对源码有想法的同学,也可查看我之前转载的一篇文章:ABPHelper.CLI及其依赖项简单介绍
编写此文章时,AbpHelper.CLI
的最版本是0.7.1
开始源码改造的初衷是想要把映射为数据库表的类的注释一同映射到数据库中,以方便在查看数据库的时候就能很直观的了解到这个表是要干嘛的,表中的字段具体代表什么含义等等。
模板类修改此部分主要修改的地方是Models
文件夹下面的实体类(EntityInfo.cs
)和属性类(PropertyInfo.cs
),具体如下:
其中,EntityInfo
类主要是记录编写的领域实体的相关信息,我主要是在其中添加了一些字段,以方便在自定义的模板中使用。而PropertyInfo
类主要记录领域实体类中公共字段的相关信息,我主要是在其中添加了对注释的获取字段。
此部分主要修改的地方是Steps/Abp
文件夹下的实体解析类(EntityParserStep.cs
)。
在其OnExecuteAsync
方法中添加类注释代码和修改属性获取相关代码,以使最终生成的数据库表中可以带上表注释和具体字段的注释。代码如下:
var className = classDeclarationSyntax.Identifier.ToString();
var classDesc = "";
var attrList = classDeclarationSyntaxAttributeLists;
if (attrList.Any())
{
classDesc = attrList.FirstOrDefault().Attributes.FirstOrDefault().ArgumentList.Arguments.FirstOrDefault().ToString();
}
var properties = root.Descendants()
.Select(prop => new PropertyInfo(prop.TypeToString(), prop.Identifier.ToString(),
prop.AttributeLists.Any() ? prop.AttributeLists.FirstOrDefault().Attributes.FirstOrDefault().ArgumentList.Arguments.FirstOrDefault().ToString() : ""))
.ToList();
模板修改
所有要生成的代码都是通过模板定义的,而这些模板位于源代码的Templates
文件夹下,其通过文件夹结构等方式定义了最终生成的相关代码。
注意:因为目前我做的项目多以API
为主,所以修改的模板都是关于abp
中的application
类型项目的模板。
目前修改的模板主要集中在Tempplates/Crud
文件夹下。
1、DbContextModelCreatingExtensions_EntityConfig
在Crud
文件夹根目录下,主要修改的模板文件是DbContextModelCreatingExtensions_EntityConfig
。我们需要修改此文件,添加数据库字段和注释的自动生成(否则即使改了源代码也没有用,最终生成的代码还是官方默认提供的生成方式)。
DbContextModelCreatingExtensions_EntityConfig
中主要的修改代码如下:
{{~ if ProjectInfo.TemplateType == "Application" ~}}
builder.Entity{ EntityInfo.Name }}(b =>
{
b.ToTable({{ ProjectInfo.Name }}Consts.DbTablePrefix + "{{ EntityInfo.NamePluralized }}", {{ ProjectInfo.Name }}Consts.DbSchema).HasComment({{ EntityInfo.NameDesc }});
b.ConfigureByConvention();
{{ configCompositeKey }}
/* Configure more properties here */
b.Property(x => x.Id).HasComment("主键,{{ EntityInfo.PrimaryKey }}").IsRequired(true);
{{~ for prop in EntityInfo.Properties ~}}
b.Property(x => x.{{ prop.Name }}).HasComment({{ prop.AttributeCommnet }}).IsRequired(false);
{{~ end ~}}
});
接下来的调整都在Crud/Groups
文件下面。
2、Repository
这一部生成的代码主要是领域、仓储相关的。我主要的调整方向是添加了领域服务相关代码的生成,因为官方默认的CLI中并没有生成,也不知道是出于什么原因。我根据自己工作中编写的习惯,把重复的、有规律的代码尽量放到了这个CLI的代码生成器中,以减少开发中的时间。所以这部分有需要的同学可以根据自己的实际情况进行扩展。
我扩展后的模板结构如下:
这边我添加了DomainService文件夹及相关类,可以通过后面介绍的实例来体会模板生成代码的神奇之处。
3、service
这一部分生成的代码主要是应用服务相关的。我主要的调整方向是Dto相关的修改和添加,领域服务实现类中的公共方法的添加等。
我扩展后的模板结构如下:
4、调试
首先你需要创建一个Abp Vnext的项目,然后在领域层(xxx.Doman
层)中创建测试用的实体类,如Book.cs
。接下来是打开源代码的【属性】,在【调试】部分输入命令即可测试了。如下图:
当代码调试没有问题的时候,我们可以在bin/Debug
文件夹下看到生成的EasyAbp.AbpHelper.0.7.1.nupkg
包。
以上只是简单介绍了我的调整情况,因为我个人的使用习惯和方向比较固定。如果你也需要修改,还是根据自己的具体情况进行修改比较好。个人是觉得可以实现个人或者公司独有的代码生成器,以提高生产率。
生成的Nuget包的安装鉴于上面我们已经自定义了CLI的代码并生成了最终的Nuget包,那下面我们就简单说明下这个包要如何的安装。
这里主要是使用dotnet tool
命令进行安装的,将其安装为命令行工具,而不是在VS中进行引用。所以保证您的计算机上安装dotnet
相关sdk
(感觉说了句废话啊)。
具体步骤如下:
1、 查看是否已经安装过了EasyAbp.AbpHelper
包
dotnet tool list -g
如果安装了需要先卸载,如下
dotnet tool uninstall -g easyabp.abphelper
注意查看执行的后提示结果
2、安装方式有两种
- 进入到
EasyAbp.AbpHelper
的Nuget安装包的目录,然后执行以下命令
dotnet tool install -g --add-source ./ EasyAbp.AbpHelper
- 将Nuget包发布到自己的Nuget服务器上,如下图:
然后执行以下安装命令
dotnet tool install -g --add-source http://localhost:10002/nuget EasyAbp.AbpHelper
效果图如下:
这样就可以使用自定义的代码生成器了。
举个栗子我们以一个简单例子进行说明。
首先创建一个Abp Vnext的项目,名为Hbw.Test
。其结构如下:
运行通过后,我们在XX.Domain
层创建一个测试实体类,名为Book.cs
。
[DisplayName("书籍相关信息")]
public class Book : AggregateRoot
{
[DisplayName("书名")]
public string BookName { get; set; }
[DisplayName("作者")]
public string Author { get; set; }
[DisplayName("出版时间")]
public DateTime PublishDate { get; set; }
}
添加DisplayName
特性就是为了在生成数据库把其中的说明也映射到数据库中
最终的生成效果如下:
当然对于生成的数据库相关代码,在进行数据库迁移之前肯定是需要根据实际情况进行加工的,个人也比较建议使用这种方式来定义数据库的表字段。关于特性约束的方式,如Required
等,我更建议在应用层的Dto中使用。以上只是个人看法。
到这里所有的内容差不多就写完了,每次的版本更新的时候,当然也要我有时间的时候,会重新生成Nuget包进行更新。因为它肯定对已有bug进行了修改,或者添加了什么新的功能。而对业务上重复代码的调整,就是通过CLI项目的模板来处理了。以上内容希望对你有所帮助。