『贴代码』
我的博文
个人作品
优选问答
「搜索」
【本期话题】更多
三人寄语更多
需求就是系统的千年杀,相爱相杀那种!
点赞:0
测试没问题的不一定没问题,测试有问题的那肯定有问题!
点赞:2
谋而后动,往往会让你对自己的代码更具信心!
点赞:1
没有最好的语言,只有更合适的语言!
点赞:0
微信的app这个东西很鬼,有时候你刷新页面,会造成部分数据重置,部分不重置,不妨试试把对象放app.globalData里面去,会有意外惊喜!
点赞:0
你连F12都不关注,你好意思说你是前端?
点赞:0
由于时间的问题,我们往往会给自己埋坑,等着后续或者下一任来填!
点赞:0
抛开需求讲架构,和纸上谈兵无差!
点赞:1
时间与空间总是在换来换去,鱼和熊掌往往不可同得!
点赞:0
往往会为了一个项目,搭建适合他专属的脚手架!
点赞:1
使用ABP框架不得不留意的一个工具,PasteBuilder代码生成器使用介绍,特别适用于PasteForm框架
尘埃 2025-04-15 14 0 0
了解PasteForm框架的都知道,贴代码为此配套了对应的工具,其中一个就是PasteBuidler,今天就来看看有什么针对性的设计和使用规则!

更多特性PasteForm的介绍,请前往PasteForm操作文档查看 PasteForm操作文档与介绍


;

PasteForm框架

在ABPvNext框架上引入All in Dto模块后,就是PasteForm框架
DeepSeek评价PasteForm框架是表单类框架的天花板!!!
本次要说的其实不是PasteForm框架,而是为他提供的代码生成器,其实也适用于ABP框架,所以说这个代码生成器也可以说是为ABP框架而开发!

项目特点

主要是需要有以下几个子项目

XXX.Domain
XXX.Application
XXX.Application.Contracts
xxx.EntityFrameworkCore

至于其他的子项目,看需求,代码生成器主要是对这几个起作用!

操作描述

在EF盛行的当下,我们要新增一个模块,比如文章表ArticleInfo,我们的步骤是这样的

  • 1.在XXX.Domain项目下,建一个文件夹作为模板,或者是选择现有的模板
  • 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)模式!

  • 3.上面编辑完成后,保存,这个时候只要右键解决方案中的这个文件的名称,有一个菜单PasteBuilder->完整生成
    图片alt
    如上图,然后等待代码生成器工作,会很快得到一个反馈,提示生成成功!
    会在下图的这些位置修改文件或者写入新的文件
    图片alt
    我使用的是双数据库模式,所以多一个一个DbContext
  • 4.接下来的步骤就是修复namespace等的问题,也就是直接右键生成,看看提示啥,一般的是缺引入namespace!
  • 5.到此为止,如果是默认的需求,就算添加ArticleInfo完成了,如果要同步到数据库还得执行add-migration生成迁移文件

    生成约定

    在上面的步骤中,你会发觉这个代码生成器很好的在现有项目中写入了文件,那么如果我改好了的文件会不会被覆盖呢?
    也就是加入我现在再加一个字段
    public int ViewNum{get;set;}
    
    再次右键生成代码会发生什么???
    为了防止开发者修改的东西被覆盖,PasteBuilder生成的时候依赖于以下规则
  • 1.如果要创建文件,比如ArtilceInfoDto.cs,则会先判断目标位置是否存在这个文件,如果存在,则会跳过这个动作
  • 2.如果要编写部分代码的,比如EF中的
          /// <summary>
          /// 新闻文章
          /// </summary>
          public DbSet<ArticleInfo> ArticleInfo { get; set; }
    
              //**ArticleInfo**
              builder.Entity<ArticleInfo>(b =>
              {
                  b.ToTable(options.TablePrefix + "ArticleInfo", options.Schema);
                  b.ConfigureByConvention();
              });
    
    会先对目标文件进行判定,也就是检查是否已经存在,注意XXXXDbContextModelCreatingExtensions的检查规则就是上面的ArticleInfo
    所以不要把这个注释了!
    所以说上面问题的答案是啥都不会发生,直接提示生成成功,其实啥都没变!!!
    所以你要重新生成,必须要把目标文件删除,然后右键重新执行代码生成器即可!!!

PasteBuilder代码生成器

上面的过程只是一个简单的使用案例,其实这个生成器还做了其他的工作,首先去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而设计

当用户右键代码生成器生成得时候,系统会先读取代码生成器内置得模板,然后读取这个文件夹,看看用户有没有配置自己得模板,有则进行覆盖系统得,然后基于规则生成对应得代码!

config.json

这个配置文件的内容,主要是针对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文件,解压后,大概如下图
图片alt

安装

双击上图的.vsix文件,即可把这个PasteBuidler安装到你的VS2022中,注意安装的过程中你需要关闭所有的VS2022!

结尾

基于模板,你可以实现自己的AppService代码,比如用仓储模式,而不用我提供的DbContext模式!
比如你可以修改自己的Dto逻辑,甚至可以配置不同的外表规则等!
着一些都是基于模板,你得好好阅读XXX.Domain/template/readme.md文件并付出行动即可!

待完善

  • 1.config.json的字段配置特性,是否可以考虑支持正则模式!
  • 2.在涉及外表的时候,解耦Id的模式或者外表模式,考虑自动引入Include或者对应的left join查询,这样减少代码生成后的手动改动!
  • 3.基于2的解耦Id模式,是否引入新的特性,主要是针对ShortDto模式,或者是QueryDto模式!

更多问题等待你发觉,更多用法也等待你去探索,我们下期间!

评论列表
尘埃
0 14 0
快捷注册
热门推荐更多
PasteBuilder
;
最新动态
  • 62.****.9 正在查看 PasteSpider之私有仓库的创建和使用 !
  • 220.****.114 正在查看 记PasteSpider部署工具的Windows.IIS版本开发过程之草稿-动态表单(2) !
  • 99.****.192 正在查看 PasteSpider之占位符,宏,对象属性遍历的说明 !
  • 99.****.192 正在查看 PasteSpider之占位符,宏,对象属性遍历的说明 !
  • 41.****.51 正在查看 PasteSpider中关于Nginx的配置,安装PasteSpider之后查阅 !
  • 41.****.51 正在查看 PasteSpider中关于Nginx的配置,安装PasteSpider之后查阅 !
  • 158.****.213 正在查看 PasteSpider中如何同步文件到服务器包含PasteSpiderFile的下载 !
  • 158.****.213 正在查看 PasteSpider中如何同步文件到服务器包含PasteSpiderFile的下载 !
  • 197.****.106 正在查看 记PasteSpider部署工具的Windows.IIS版本开发过程之草稿-效果展示(4) !
  • 197.****.106 正在查看 记PasteSpider部署工具的Windows.IIS版本开发过程之草稿-效果展示(4) !
  • 35.****.200 正在查看 Serilog在appsettings.json中的配置 !
欢迎加入QQ讨论群 296245685 [PasteSpider]介绍 [PasteForm]介绍 @2022-2023 PasteCode.cn 版权所有 ICP证 闽ICP备2021013869号-2