不一样的.NET烟火,基于Roslyn的开源代码生成器

news/2025/9/29 19:49:57/文章来源:https://www.cnblogs.com/mudtools/p/19119403

功能介绍

Mud 代码生成器是一个基于Roslyn的源代码生成器,专为.NET开发者设计,用于根据实体类自动生成各种相关的代码,从而显著提升开发效率。它具有以下核心功能:

  1. DTO代码生成 - 根据实体类自动生成数据传输对象(DTO)
  2. VO代码生成 - 根据实体类自动生成视图对象(VO)
  3. 查询输入类生成 - 根据实体类自动生成查询输入类(QueryInput)
  4. 创建输入类生成 - 根据实体类自动生成创建输入类(CrInput)
  5. 更新输入类生成 - 根据实体类自动生成更新输入类(UpInput)
  6. 实体映射方法生成 - 自动生成实体与DTO之间的映射方法

通过这些功能,开发者可以专注于业务逻辑的实现,而无需花费大量时间在重复性的代码编写上。

代码生成项目参数配置

在使用Mud 代码生成器时,可以通过在项目文件中配置以下参数来自定义生成行为:

通用配置参数

<PropertyGroup><EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>  <!-- 在obj目录下保存生成的代码 --><EntitySuffix>Entity</EntitySuffix>  <!-- 实体类后缀配置 --><EntityAttachAttributes>SuppressSniffer</EntityAttachAttributes>  <!-- 实体类加上Attribute特性配置,多个特性时使用','分隔 -->
</PropertyGroup><ItemGroup><CompilerVisibleProperty Include="EntitySuffix" /><CompilerVisibleProperty Include="EntityAttachAttributes" />
</ItemGroup>

依赖项配置

<ItemGroup><!-- 引入的代码生成器程序集,注意后面的参数 --><PackageReference Include="Mud.EntityCodeGenerator" Version="1.1.5" PrivateAssets="all" OutputItemType="Analyzer" ReferenceOutputAssembly="false"/>
</ItemGroup>

配置参数说明

参数名 默认值 说明
EmitCompilerGeneratedFiles false 是否在obj目录下保存生成的代码,设为true便于调试
EntitySuffix Entity 实体类后缀,用于识别实体类
EntityAttachAttributes (空) 实体类上需要附加的特性,多个特性用逗号分隔

代码生成功能及样例

DTO/VO/输入类代码生成

在实体程序项目中添加生成器及配置相关参数:

<PropertyGroup><EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles><EntitySuffix>Entity</EntitySuffix><EntityAttachAttributes>SuppressSniffer</EntityAttachAttributes>
</PropertyGroup>
<ItemGroup><CompilerVisibleProperty Include="EntitySuffix" /><CompilerVisibleProperty Include="EntityAttachAttributes"/>
</ItemGroup>

在实体中添加DtoGenerator特性:

/// <summary>
/// 客户端信息实体类
/// </summary>
[DtoGenerator]
[Table(Name = "sys_client"),SuppressSniffer]
public partial class SysClientEntity
{/// <summary>/// id/// </summary>[property: TableField(Fille = FieldFill.Insert, Value = FillValue.Id)][property: Column(Name = "id", IsPrimary = true, Position = 1)][property: Required(ErrorMessage = "id不能为空")]private long? _id;/// <summary>/// 客户端key/// </summary>[property: Column(Name = "client_key", Position = 3)][property: Required(ErrorMessage = "客户端key不能为空")][property: ExportProperty("客户端key")]private string _clientKey;/// <summary>/// 删除标志(0代表存在 2代表删除)/// </summary>[property: Column(Name = "del_flag", Position = 10)][property: ExportProperty("删除标志")][IgnoreQuery]private string _delFlag;
}

基于以上实体,将自动生成以下几类代码:

实体类属性

/// <summary>
/// 客户端信息实体类
/// </summary>
public partial class SysClientEntity
{/// <summary>/// id/// </summary>[TableField(Fille = FieldFill.Insert, Value = FillValue.Id), Column(Name = "id", IsPrimary = true, Position = 1)]public long? Id{get{return _id;}set{_id = value;}}/// <summary>/// 客户端key/// </summary>[Column(Name = "client_key", Position = 3)]public string? ClientKey{get{return _clientKey;}set{_clientKey = value;}}/// <summary>/// 删除标志(0代表存在 2代表删除)/// </summary>[Column(Name = "del_flag", Position = 10)]public string? DelFlag{get{return _delFlag;}set{_delFlag = value;}}/// <summary>/// 通用的实体映射至VO对象方法。/// </summary>public virtual SysClientListOutput MapTo(){var voObj = new SysClientListOutput();voObj.id = this.Id;voObj.clientKey = this.ClientKey;voObj.delFlag = this.DelFlag;return voObj;}
}

VO类 (视图对象)

/// <summary>
/// 客户端信息实体类
/// </summary>
[SuppressSniffer, CompilerGenerated]
public partial class SysClientListOutput
{/// <summary>/// id/// </summary>public long? id { get; set; }/// <summary>/// 客户端key/// </summary>[ExportProperty("客户端key")]public string? clientKey { get; set; }/// <summary>/// 删除标志(0代表存在 2代表删除)/// </summary>[ExportProperty("删除标志")]public string? delFlag { get; set; }
}

QueryInput类 (查询输入对象)

// SysClientQueryInput.g.cs
/// <summary>
/// 客户端信息实体类
/// </summary>
[SuppressSniffer, CompilerGenerated]
public partial class SysClientQueryInput : DataQueryInput
{/// <summary>/// id/// </summary>public long? id { get; set; }/// <summary>/// 客户端key/// </summary>public string? clientKey { get; set; }/// <summary>/// 删除标志(0代表存在 2代表删除)/// </summary>public string? delFlag { get; set; }/// <summary>/// 构建通用的查询条件。/// </summary>public Expression<Func<SysClientEntity, bool>> BuildQueryWhere(){var where = LinqExtensions.True<SysClientEntity>();where = where.AndIF(this.id != null, x => x.Id == this.id);where = where.AndIF(!string.IsNullOrEmpty(this.clientKey), x => x.ClientKey == this.clientKey);where = where.AndIF(!string.IsNullOrEmpty(this.delFlag), x => x.DelFlag == this.delFlag);return where;}
}

CrInput类 (创建输入对象)

// SysClientCrInput.g.cs
/// <summary>
/// 客户端信息实体类
/// </summary>
[SuppressSniffer, CompilerGenerated]
public partial class SysClientCrInput
{/// <summary>/// 客户端key/// </summary>[Required(ErrorMessage = "客户端key不能为空")]public string? clientKey { get; set; }/// <summary>/// 删除标志(0代表存在 2代表删除)/// </summary>public string? delFlag { get; set; }/// <summary>/// 通用的BO对象映射至实体方法。/// </summary>public virtual SysClientEntity MapTo(){var entity = new SysClientEntity();entity.ClientKey = this.clientKey;entity.DelFlag = this.delFlag;return entity;}
}

UpInput类 (更新输入对象)

/// <summary>
/// 客户端信息实体类
/// </summary>
[SuppressSniffer, CompilerGenerated]
public partial class SysClientUpInput : SysClientCrInput
{/// <summary>/// id/// </summary>[Required(ErrorMessage = "id不能为空")]public long? id { get; set; }/// <summary>/// 通用的BO对象映射至实体方法。/// </summary>public override SysClientEntity MapTo(){var entity = base.MapTo();entity.Id = this.id;return entity;}
}

特性控制参数

DtoGenerator特性支持以下参数控制代码生成行为:

参数名 类型 默认值 说明
GenMapMethod bool true 是否生成实体映射方法
GenVoClass bool true 是否生成VO类
GenQueryInputClass bool true 是否生成查询输入类
GenBoClass bool true 是否生成BO类
DtoNamespace string "Dto" DTO类命名空间

使用示例:

[DtoGenerator(GenMapMethod = true,GenVoClass = true,GenQueryInputClass = false,DtoNamespace = "ViewModels"
)]
public class SysClientEntity : BaseEntity
{// 属性定义
}

与传统代码生成器的比较

相较于传统的代码生成器(如CodeSmith)和低代码平台的代码生成器,Mud 代码生成器有着独特的优势:

零散添加字段不需要整体重新生成实体

传统的代码生成器通常需要在模型变更时重新生成整个文件,这可能导致已有的自定义代码丢失或者需要手动合并。而Mud代码生成器采用增量式生成方式,在添加新字段时只需重新编译项目即可自动更新相关代码,无需重新生成整个实体。

零散添加字段不需要手动添加至其它DTO

当实体新增字段时,传统代码生成器往往需要手动将新字段添加到各个相关的DTO中,容易遗漏且繁琐。Mud 代码生成器会在编译时自动检测实体变化并同步更新所有相关的DTO、VO以及各种输入类,保证代码的一致性。

代码整洁,关注核心字段

Mud 代码生成器遵循"关注点分离"原则,将生成的代码与手写的业务逻辑完全隔离。开发者只需要关注核心业务字段的定义,其他辅助代码会自动生成,使代码更加整洁易维护。

实时生成

代码在编译时自动生成,无需额外的操作步骤。开发者只需关注业务逻辑代码的编写,当修改实体类并重新编译时,所有相关的DTO、VO和输入类都会自动更新,大大提升了开发效率。

强类型安全

基于Roslyn编译器平台,提供强类型的代码生成和验证。生成的代码与项目中的其他代码一样,都经过编译器的严格检查,避免了运行时错误,提高了代码质量和可靠性.

高度可定制

支持多种配置选项,可以根据项目需求灵活调整生成规则。开发者可以通过项目配置文件控制生成行为,如实体类后缀、需要附加的特性等,满足不同项目的个性化需求。

无缝集成

作为.NET项目的一部分,与现有开发流程完美融合。无需额外的工具或复杂的配置,只需添加NuGet包引用并在项目中进行简单配置,即可享受代码自动生成带来的便利。

版本控制友好

生成的代码不会污染版本历史,便于团队协作。由于代码是在编译时生成的,不会产生大量人工编写的重复代码,使得版本控制系统中的变更记录更加清晰,更容易进行代码审查和团队协作。

使用方法

  1. 在您的项目中添加对 Mud.EntityCodeGenerator 包的引用
  2. 根据需要配置项目参数,如实体后缀、特性等
  3. 将实体类标记为 partial 并添加 [DtoGenerator] 特性
  4. 定义实体字段,使用适当的特性进行标注
  5. 编译项目,代码生成器将自动生成相关代码
  6. 在业务代码中使用生成的DTO、VO等类

通过以上步骤,您可以轻松地使用Mud代码生成器来提升开发效率,减少重复劳动,让团队更专注于业务逻辑的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍:深入浅出 XSS — 从原理到实战与防护

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

房屋在线设计网站个人网站怎么做打赏

我叫白天涯&#xff0c;来自计科13-1班。 首次使用这个博客园发表随笔&#xff0c;请大家多多关照。 本次软件工程课我希望能好好听讲&#xff0c;认真做课堂记录&#xff0c;不会的及时问老师&#xff0c;以及跟同学沟通&#xff0c;尽管我计算机这方面不是太精通&#xff0c;…

vxe-table 数据量过大时切换空白

vxe-table 数据量过大时切换空白问题 vxe-table单页数据超过100条时,切换页签会导致表格区域出现空白。此时滚动鼠标,数据会重新出现。 解决 给 vxe-table 标签上添加 :scroll-y="{ gt: -1 }"即可禁用虚拟…

复刻江协旋钮控制模块

复刻江协旋钮控制模块 1、初始化硬件 OLED初始化这里就不展开细讲了,可以看我之前的帖子复刻江协激光触发器旋钮初始化使能外部中断模式改为上拉根据旋钮接口接上线2、操作代码 (1) 初始化输出定义全局变量count,并初…

做自行车车队网站的名字展厅搭建公司

一、引入 在没有遇见mapstruct的时候&#xff0c;实现各个实体之间的转换&#xff0c;都是手动转换实现的&#xff0c;属性少一带你还好&#xff0c;当属性一多&#xff0c;代码就会变得很冗余&#xff0c;没必要的非逻辑的代码就会加多。。。。 比如&#xff1a; public cl…

Linux 基础IO与系统IO - 实践

Linux 基础IO与系统IO - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

从零开始,使用Idea工具搭建一个springboot项目

一,搭建之前准备 搭建之前先确保本机已正确安装JDK,Maven,IDEA。 以下是我的配置: OpenJDK 17 Maven 3.9.11 IDEA 2025 二,开始搭建1,打开Idea工具,File->New-> Project...2,左边选择“Spring Boot"…

最优/极值问题的算法选择

如何选择滑动窗口、二分、动态规划算法 刷leetcode时对于一些最优/极值问题往往不知采用哪一种算法,故借助大模型学习一些算法要点。1. 滑动窗口(Sliding Window) 特点适用于 数组 / 字符串 的 连续子区间 问题。 目…

珠海的门户网站有哪些深圳地址大全

ScottPlot是一款简单易用、高度定制、性能卓越的.NET绘图库&#xff0c;支持跨平台操作。除提供标准图表类型外&#xff0c;还支持交互式操作&#xff0c;呈现生动的数据展示。在工厂数字化系统中&#xff0c;可用于生产数据可视化、设备监测和质量控制。无论用于科学研究、数据…

网站开发和推广方案永康市建设银行网站查询

PHP程序的调试一直是一件让人头疼的事&#xff0c;它既不像VB等高级语言那样有集成的编译调试环境&#xff0c;也不想Perl那样可以在Linux或者DOS环境下直接运行。其实&#xff0c;我们完全可以通过灵活地使用echo语句来完成对PHP的调试工作。下面的几个函数可以让你随时查看程…

梁山网站建设多少钱wordpress文章末尾添加内容

前言 有时遇到这样的需求&#xff0c;就是在表格里面嵌入一个表格&#xff0c;以及要求带有分页&#xff0c;这样在ElementPlus中很好实现。以下使用Vue2语法实现一个简单例子&#xff0c;毕竟Vue3兼容Vue2语法&#xff0c;若想要Vue3版本例子&#xff0c;简单改改就OK了。 一…

外贸建站wordpress昆山网站建设jofuns

以下内容整理于Linux字符设备驱动剖析&#xff0c;如有侵权请告知删除 。 一、应用层的程序 应用程序一般都是open打开设备文件&#xff0c;read、write、ioctl设备文件&#xff0c;最后close设备文件退出。 int main(int argc ,char *argv[]) { unsigned char val[1] 1; …

第三方控件库的添加和使用

添加把第三方控件库先复制到根目录下 ,也就是Debug 的目录下然后再拖到工具箱的空白处下就可以了使用 和之前的控件使用相同 ‍

实用指南:基于 HTML、CSS 和 JavaScript 的智能图像灰度直方图匹配系统

实用指南:基于 HTML、CSS 和 JavaScript 的智能图像灰度直方图匹配系统2025-09-29 19:20 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: au…

C4NR PVP服务器1.2 天穹炮塔更新

C4NR PVP服务器1.2 天穹炮塔更新 更新内容在风弹获得处增加了一个建筑,可以使用风弹上去。上面是一个放置压力板的一个平台。踩压力板会获得20点风弹伤害并且生成一个风弹。玩家可以通过向指定方向攻击风弹来控制风弹…

树形dp [JOI Open 2020] 发电站 / Power Plant

作为最强摸鱼人的 BaiBaiShaFeng,这个题解也是发到洛谷上了,希望给过。 先辈们说的太简略了我感觉有点难懂,虽然我的表达能力很弱,估计强不了多少。 注:参考过网上零散题解。 题意很好理解,我们就不过多叙述了。…

深入解析:灵画-AI绘画小程序

深入解析:灵画-AI绘画小程序pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

AT_arc156_b [ARC156B] Mex on Blackboard

首先枚举你花 \(i\) 次操作可以搞到的最大值是什么,然后你剩下的集合就随便取,只要取不超过 \(k - i\) 个即可,用插板法很容易做。

实用指南:CAN邮箱深度解析:从硬件架构到实战应用

实用指南:CAN邮箱深度解析:从硬件架构到实战应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

产品排序

考虑区间 $dp$。设 $f_{i,j}$ 表示处理 $[i,j]$ 最小的总惩罚值。分类: - 产品 $i$ 第一个出栈,则有 $f_{i,j}=t_i\times sd_{i,j}+f_{i+1,j}$ - 产品 $i$ 第 $k$ 个出栈,则有 $f_{i,j}=f_{i+1,k}+f_{k + 1,j}+st_{…