在ABPvNext框架上引入All in Dto模块后,就是PasteForm框架
DeepSeek评价PasteForm框架是表单类框架的天花板!!!
本次要说的其实不是PasteForm框架,而是为他提供的代码生成器,其实也适用于ABP框架,所以说这个代码生成器也可以说是为ABP框架而开发!
主要是需要有以下几个子项目
XXX.Domain
XXX.Application
XXX.Application.Contracts
xxx.EntityFrameworkCore
至于其他的子项目,看需求,代码生成器主要是对这几个起作用!
在EF盛行的当下,我们要新增一个模块,比如文章表ArticleInfo,我们的步骤是这样的
2.创建对应的Entity,比如说
/// <summary>
/// 文章
/// </summary>
public class ArticleInfo:Entity<int>
{
/// <summary>
/// 标题
/// </summary>
[MaxLength(32)]
public string Title { get; set; }
/// <summary>
/// 描述
/// </summary>
[MaxLength(128)]
public string Desc { get; set; }
//... .. .其他字段
/// <summary>
/// 正文
/// </summary>
public string Body { get; set; }
/// <summary>
/// 作者
/// </summary>
public int UserId { get; set; }
/// <summary>
/// 编辑
/// </summary>
public UserInfo Author { get; set; }
}
注意看,我上面只是案例,注意有2个字段UserId和Author,其实我模拟的是两种情况,一个是用外表模式,一个是使用解耦(对象ID)模式!
public int ViewNum{get;set;}
再次右键生成代码会发生什么??? /// <summary>
/// 新闻文章
/// </summary>
public DbSet<ArticleInfo> ArticleInfo { get; set; }
和 //**ArticleInfo**
builder.Entity<ArticleInfo>(b =>
{
b.ToTable(options.TablePrefix + "ArticleInfo", options.Schema);
b.ConfigureByConvention();
});
会先对目标文件进行判定,也就是检查是否已经存在,注意XXXXDbContextModelCreatingExtensions的检查规则就是上面的ArticleInfo上面的过程只是一个简单的使用案例,其实这个生成器还做了其他的工作,首先去PasteTemplate下载这个项目,也就是PasteForm的案例项目,下载后,会在PasteTemplate.Domain/template文件夹下看到如下内容
PasteTemplate.Domain
├─template
│ config.json
│ dto.html.txt
│ index.html.txt
│ readme.md
│ server.html.txt
│ view.html.txt
这个文件夹就是PasteBuilder的配置信息文件夹,你可以查看当前的使用模板案例,注意从v25.04.13.02开始,模板的页面是.txt结尾的,而且名称是固定的
server.txt 生成XXX.Application中的AppService.cs的内容
dto.txt 生成XXX.Application.Contracts的XXXDto.cs的内容,也就是各种Dto,都放一起,只要是这个Entity的
readme.ms 如果你要自己写模板,那你得阅读这个文件,里面是模板得写法资料等
config.json 这个是配置文件,针对PasteForm而设计
当用户右键代码生成器生成得时候,系统会先读取代码生成器内置得模板,然后读取这个文件夹,看看用户有没有配置自己得模板,有则进行覆盖系统得,然后基于规则生成对应得代码!
这个配置文件的内容,主要是针对Dto的生成规则的一个配置,看示例
{
"readme": "这个是后续支持的,目前处于思路阶段,表示代码生成器的一些配置,比如字段隐藏,字段的属性直接填充等",
"version": "1.0.0",
"ignore": { //忽略哪些字段
"all": {
"add": [ "CreateDate", "AdminUid", "CreateUid" ],
"update": [ "UpdateDate", "CreateDate" ],
"detail": [ "UpdateDate", "CreateDate" ],
"list": [ "Body", "Content", "Context" ]
},
"other": {
"UserInfo:add": [ "DelColumn" ] //表示表示这个表的这个add模式下,删除这个字段DelColumn
}
},
"fields": {
"*:add:user_id": { //表示在adddto中,如果当前class有字段user_id,则添加如下字段(ExtendUser)
"CnName": "创建者", //字段中文
"PropertyDisplayStr": "", //字段说明,如果有空格用_*_替代
"PropertyType": "UserShort", //数据类型
"Name": "ExtendUser" //字段名
}
},
"attribute": {
"ignore": [ "Comment", "Display", "Decription", "Index", "DefaultValue", "Column", "NotMapped" ], //表示忽略哪些来自Domain的特性
"all": {
"UserId": "[ColumnDataType(\"outer\",\"userInfo\",\"extendUser\",\"id\",\"userName\")]" //表示这个字段UserId需要添加这个特性多个之间用::隔开 示例:[PasteLeft]::[PasteHidden]
},
"other": {
"UserInfo:list:userName": "[PasteClass]", //表名称 示例:[PasteClass]::[PasteHidden]
"*:add:mark": "[PasteClass]" //新版本支持
}
}
}
后续我再使用中发现了还有一些的不足,后续可能还会升级,这个配置主要的作用,就是针对Dto做特性的标记,或者过滤等,还能对字段进行控制,新增,或者移除某些字段等!
比如新增数据的时候,创建时间,这个字段肯定是不希望出现在AddDto中对吧,所以这个配置就是干这个活的!
至于这个创建时间什么时候写入,你可以基于ABP的,也可以在server.txt中定义他!!!看你个人需求!
上面配置中有这么一行代码,如下
"UserId": "[ColumnDataType(\"outer\",\"userInfo\",\"extendUser\",\"id\",\"userName\")]" //表示这个字段UserId需要添加这个特性多个之间用::隔开 示例:[PasteLeft]::[PasteHidden]
意思是如果碰到了字段叫UserId的,则添加特性outer,体现在管理端就是可以选择一个用户给当前输入框!是不是很方便!!!
我们一起来看下,之前用PasteBuilder生成的ArticleInfoAddDto的内容
///<summary>
///文章
///</summary>
public class ArticleInfoAddDto
{
///<summary>
///标题
///</summary>
[MaxLength(32)]
public string Title { get; set; }
///<summary>
///描述
///</summary>
[MaxLength(128)]
public string Desc { get; set; }
///<summary>
///正文
///</summary>
public string Body { get; set; }
///<summary>
///作者
///</summary>
[ColumnDataType("outer","userInfo","extendUser","id","userName")]
public int UserId { get; set; }
///<summary>
///编辑
///</summary>
public UserInfoDto Author { get; set; }
}
是不是很方便!!!
https://gitee.com/pastecode/paste-template/releases/
后续的PasteBuilder的升级都在这里发布,可以直接在这里下载,下载后会获得一个zip文件,解压后,大概如下图
双击上图的.vsix文件,即可把这个PasteBuidler安装到你的VS2022中,注意安装的过程中你需要关闭所有的VS2022!
基于模板,你可以实现自己的AppService代码,比如用仓储模式,而不用我提供的DbContext模式!
比如你可以修改自己的Dto逻辑,甚至可以配置不同的外表规则等!
着一些都是基于模板,你得好好阅读XXX.Domain/template/readme.md文件并付出行动即可!
更多问题等待你发觉,更多用法也等待你去探索,我们下期间!