Mud 代码生成器详解
Mud 代码生成器是一套基于 Roslyn 的源代码生成器,用于根据实体类和服务类自动生成相关代码,提高开发效率。该套件包含以下两个主要组件:
Mud.EntityCodeGenerator - 实体代码生成器,根据实体类自动生成各种相关代码
- DTO代码生成 - 根据实体类自动生成数据传输对象(DTO)
- VO代码生成 - 根据实体类自动生成视图对象(VO)
- 查询输入类生成 - 根据实体类自动生成查询输入类(QueryInput)
- 创建输入类生成 - 根据实体类自动生成创建输入类(CrInput)
- 更新输入类生成 - 根据实体类自动生成更新输入类(UpInput)
- 实体映射方法生成 - 自动生成实体与DTO之间的映射方法
Mud.ServiceCodeGenerator - 服务代码生成器,用于自动生成服务层相关代码
- 服务类代码生成 - 根据实体类自动生成服务接口和服务实现类
- 依赖注入代码生成 - 自动为类生成构造函数注入代码,包括日志、缓存、用户管理等常用服务
模块概览
模块 | 当前版本 | 下载 | 开源协议 |
---|---|---|---|
开源项目
组件详细介绍
实体代码生成器
实体代码生成器主要用于根据实体类自动生成各种相关代码,包括DTO、VO、查询输入类、创建输入类、更新输入类以及实体映射方法等。
详细使用方法和配置参数请参考:实体代码生成器详细说明
服务代码生成器
服务代码生成器主要用于自动生成服务层相关代码,包括服务接口和服务实现类,以及依赖注入相关的构造函数代码。
详细使用方法和配置参数请参考:服务代码生成器详细说明
与传统代码生成器的比较
相较于传统的代码生成器(如CodeSmith)和低代码平台的代码生成器,Mud Entity代码生成器有着独特的优势:
零散添加字段不需要整体重新生成实体
传统的代码生成器通常需要在模型变更时重新生成整个文件,这可能导致已有的自定义代码丢失或者需要手动合并。而Mud Entity代码生成器采用增量式生成方式,在添加新字段时只需重新编译项目即可自动更新相关代码,无需重新生成整个实体。
零散添加字段不需要手动添加至其它DTO
当实体新增字段时,传统代码生成器往往需要手动将新字段添加到各个相关的DTO中,容易遗漏且繁琐。Mud Entity代码生成器会在编译时自动检测实体变化并同步更新所有相关的DTO、VO以及各种输入类,保证代码的一致性。
代码整洁,关注核心字段
Mud Entity代码生成器遵循"关注点分离"原则,将生成的代码与手写的业务逻辑完全隔离。开发者只需要关注核心业务字段的定义,其他辅助代码会自动生成,使代码更加整洁易维护。
实时生成
代码在编译时自动生成,无需额外的操作步骤。开发者只需关注业务逻辑代码的编写,当修改实体类并重新编译时,所有相关的DTO、VO和输入类都会自动更新,大大提升了开发效率。
强类型安全
基于Roslyn编译器平台,提供强类型的代码生成和验证。生成的代码与项目中的其他代码一样,都经过编译器的严格检查,避免了运行时错误,提高了代码质量和可靠性。
高度可定制
支持多种配置选项,可以根据项目需求灵活调整生成规则。开发者可以通过项目配置文件控制生成行为,如实体类后缀、需要附加的特性等,满足不同项目的个性化需求。
无缝集成
作为.NET项目的一部分,与现有开发流程完美融合。无需额外的工具或复杂的配置,只需添加NuGet包引用并在项目中进行简单配置,即可享受代码自动生成带来的便利。
版本控制友好
生成的代码不会污染版本历史,便于团队协作。由于代码是在编译时生成的,不会产生大量人工编写的重复代码,使得版本控制系统中的变更记录更加清晰,更容易进行代码审查和团队协作。
项目参数配置
EntityCodeGenerator配置参数
详细配置参数请参考:实体代码生成器详细说明
ServiceCodeGenerator配置参数
详细配置参数请参考:服务代码生成器详细说明
使用示例
安装NuGet包
首先,在你的项目中安装相应的NuGet包:
<PackageReference Include="Mud.EntityCodeGenerator" Version="1.1.6" />
<PackageReference Include="Mud.ServiceCodeGenerator" Version="1.1.6" />
配置项目文件
在你的项目文件(.csproj)中添加以下配置:
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<EntitySuffix>Entity</EntitySuffix>
<EntityAttachAttributes>SuppressSniffer</EntityAttachAttributes>
</PropertyGroup>
<ItemGroup>
<CompilerVisibleProperty Include="EntitySuffix" />
<CompilerVisibleProperty Include="EntityAttachAttributes"/>
</ItemGroup>
具体配置请参见对应的组件。
创建实体类
创建一个简单的实体类:
[DtoGenerator]
public partial class ProductEntity
{
private int _id ;
public string _name ;
public decimal _price ;
public DateTime _createdTime ;
}
编译项目
保存并编译项目,代码生成器会自动生成以下文件:
- ProductListOutput - 视图对象(VO)
- ProductQueryInput - 查询输入类
- ProductCrInput - 创建输入类
- ProductUpInput - 更新输入类
常见问题解答
生成的代码在哪里可以查看?
要查看生成的代码,可以在项目文件中添加以下配置:
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
</PropertyGroup>
生成的代码将位于 obj/[Configuration]/[TargetFramework]/generated/
目录下,文件名以 .g.cs
结尾。
如何排除某些属性不参与生成?
可以使用[IgnoreGenerator]
特性标记不想参与代码生成的字段。
如何自定义生成类的命名空间?
可以通过在实体类上使用[DtoGenerator(DtoNamespace = "ViewModels")]
等参数来自定义生成行为。
生成的代码是否会影响性能?
生成的代码在编译时就已经确定,不会对运行时性能产生额外影响。生成的映射方法使用表达式树进行优化,具有良好的性能表现。
最佳实践
- 合理使用部分类:将实体类定义为partial类,便于生成代码与手写代码分离
- 统一命名规范:在团队中统一实体类和生成类的命名规范
- 适当配置生成选项:根据项目需求合理配置生成选项,避免生成不必要的代码
- 结合IDE使用:充分利用IDE的智能提示和导航功能,提高开发效率
- 版本控制:虽然生成代码不提交到版本控制,但应确保团队成员使用相同版本的代码生成器