Skip to content

Mud 代码生成器详解

Mud 代码生成器是一套基于 Roslyn 的源代码生成器,用于根据实体类和服务类自动生成相关代码,提高开发效率。该套件包含以下两个主要组件:

Mud.EntityCodeGenerator - 实体代码生成器,根据实体类自动生成各种相关代码

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

Mud.ServiceCodeGenerator - 服务代码生成器,用于自动生成服务层相关代码

  • 服务类代码生成 - 根据实体类自动生成服务接口和服务实现类
  • 依赖注入代码生成 - 自动为类生成构造函数注入代码,包括日志、缓存、用户管理等常用服务

模块概览

模块当前版本下载开源协议
Mud.EntityCodeGeneratorNugetNugetLicense
Mud.ServiceCodeGeneratorNugetNugetLicense

开源项目

** Mud-Code-Generator 源代码**

组件详细介绍

实体代码生成器

实体代码生成器主要用于根据实体类自动生成各种相关代码,包括DTO、VO、查询输入类、创建输入类、更新输入类以及实体映射方法等。

详细使用方法和配置参数请参考:实体代码生成器详细说明

服务代码生成器

服务代码生成器主要用于自动生成服务层相关代码,包括服务接口和服务实现类,以及依赖注入相关的构造函数代码。

详细使用方法和配置参数请参考:服务代码生成器详细说明

与传统代码生成器的比较

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

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

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

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

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

代码整洁,关注核心字段

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

实时生成

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

强类型安全

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

高度可定制

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

无缝集成

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

版本控制友好

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

项目参数配置

EntityCodeGenerator配置参数

详细配置参数请参考:实体代码生成器详细说明

ServiceCodeGenerator配置参数

详细配置参数请参考:服务代码生成器详细说明

使用示例

安装NuGet包

首先,在你的项目中安装相应的NuGet包:

xml
<PackageReference Include="Mud.EntityCodeGenerator" Version="1.1.6" />
<PackageReference Include="Mud.ServiceCodeGenerator" Version="1.1.6" />

配置项目文件

在你的项目文件(.csproj)中添加以下配置:

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

具体配置请参见对应的组件。

创建实体类

创建一个简单的实体类:

csharp
[DtoGenerator]
public partial class ProductEntity
{
    private int _id ;
    public string _name ;
    public decimal _price ;
    public DateTime _createdTime ;
}

编译项目

保存并编译项目,代码生成器会自动生成以下文件:

  • ProductListOutput - 视图对象(VO)
  • ProductQueryInput - 查询输入类
  • ProductCrInput - 创建输入类
  • ProductUpInput - 更新输入类

常见问题解答

生成的代码在哪里可以查看?

要查看生成的代码,可以在项目文件中添加以下配置:

xml
<PropertyGroup>
  <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
</PropertyGroup>

生成的代码将位于 obj/[Configuration]/[TargetFramework]/generated/ 目录下,文件名以 .g.cs 结尾。

如何排除某些属性不参与生成?

可以使用[IgnoreGenerator]特性标记不想参与代码生成的字段。

如何自定义生成类的命名空间?

可以通过在实体类上使用[DtoGenerator(DtoNamespace = "ViewModels")]等参数来自定义生成行为。

生成的代码是否会影响性能?

生成的代码在编译时就已经确定,不会对运行时性能产生额外影响。生成的映射方法使用表达式树进行优化,具有良好的性能表现。

最佳实践

  1. 合理使用部分类:将实体类定义为partial类,便于生成代码与手写代码分离
  2. 统一命名规范:在团队中统一实体类和生成类的命名规范
  3. 适当配置生成选项:根据项目需求合理配置生成选项,避免生成不必要的代码
  4. 结合IDE使用:充分利用IDE的智能提示和导航功能,提高开发效率
  5. 版本控制:虽然生成代码不提交到版本控制,但应确保团队成员使用相同版本的代码生成器