# MudCodeGenerator
**Repository Path**: mudtools/mud-code-generator
## Basic Information
- **Project Name**: MudCodeGenerator
- **Description**: Mud代码生成器是一套.net平台基于 Roslyn 的c#源代码生成器,用于根据实体类和服务类自动生成DTO代码、服务端注入代码及通用查询代码,能极大的提高.net平台软件开发效率。
- **Primary Language**: C#
- **License**: MIT
- **Default Branch**: master
- **Homepage**: https://www.mudtools.cn/
- **GVP Project**: No
## Statistics
- **Stars**: 15
- **Forks**: 2
- **Created**: 2025-09-29
- **Last Updated**: 2025-12-11
## Categories & Tags
**Categories**: code-generator
**Tags**: None
## README
# Mud 代码生成器
## 功能概览
Mud 代码生成器是一套基于 Roslyn 的源代码生成器,用于根据实体类和服务接口自动生成相关代码,提高开发效率。
### 主要组件
| 组件 | 功能描述 | NuGet |
|------|----------|-------|
| Mud.EntityCodeGenerator | 实体代码生成:DTO、VO、QueryInput、CrInput、UpInput、Builder模式 | [](https://www.nuget.org/packages/Mud.EntityCodeGenerator/) |
| Mud.ServiceCodeGenerator | 服务代码生成:HttpClient API、依赖注入、COM包装、自动注册 | [](https://www.nuget.org/packages/Mud.ServiceCodeGenerator/) |
## 快速开始
### 1. 安装包
```xml
```
### 2. 基本配置
```xml
true
Entity
```
## 核心功能
### 1. 实体代码生成
#### 基本使用
```csharp
[DtoGenerator]
[Builder]
public partial class UserEntity
{
private long? _id;
private string _name;
private string _email;
}
```
#### 自动生成内容
- **DTO/VO 类** - 数据传输对象和视图对象
- **QueryInput 类** - 查询条件输入对象
- **CrInput/UpInput 类** - 创建和更新输入对象
- **Builder 模式** - 链式构建器
- **映射方法** - 实体与DTO间自动转换
#### 生成示例
```csharp
// VO 类
[SuppressSniffer, CompilerGenerated]
public partial class UserListOutput
{
public long? id { get; set; }
public string? name { get; set; }
public string? email { get; set; }
}
// QueryInput 类
[SuppressSniffer, CompilerGenerated]
public partial class UserQueryInput : DataQueryInput
{
public long? id { get; set; }
public string? name { get; set; }
public Expression> BuildQueryWhere()
{
var where = LinqExtensions.True();
where = where.AndIF(this.id != null, x => x.Id == this.id);
where = where.AndIF(!string.IsNullOrEmpty(this.name), x => x.Name == this.name);
return where;
}
}
// Builder 类
public class UserEntityBuilder
{
private UserEntity _userEntity = new UserEntity();
public UserEntityBuilder SetName(string name)
{
_userEntity.Name = name;
return this;
}
public UserEntityBuilder SetEmail(string email)
{
_userEntity.Email = email;
return this;
}
public UserEntity Build()
{
return _userEntity;
}
}
```
### 2. HttpClient API 代码生成
#### 基本使用
```csharp
[HttpClientApi("https://api.example.com", Timeout = 30)]
public interface IUserApi
{
[Get("users/{id}")]
Task GetUserAsync(string id);
[Post("users")]
Task CreateUserAsync([Body] CreateUserRequest request);
[Put("users/{id}")]
Task UpdateUserAsync(string id, [Body] UpdateUserRequest request);
[Delete("users/{id}")]
Task DeleteUserAsync(string id);
[Get("users")]
Task> GetUsersAsync([Query] string? name = null, [Query] int page = 1);
}
```
#### 支持的HTTP方法
- `[Get("path")]` - GET请求
- `[Post("path")]` - POST请求
- `[Put("path")]` - PUT请求
- `[Delete("path")]` - DELETE请求
- `[Patch("path")]` - PATCH请求
- `[Head("path")]` - HEAD请求
- `[Options("path")]` - OPTIONS请求
#### 参数类型支持
```csharp
[Get("users/{userId}/posts/{postId}")] // 路径参数
Task GetPostAsync(string userId, string postId);
[Get("users")] // 查询参数
Task> GetUsersAsync([Query] string? name, [Query] int page = 1);
[Post("users")] // 请求体参数
Task CreateUserAsync([Body] CreateUserRequest request);
[Post("users")] // 请求头参数
Task CreateUserAsync([Body] CreateUserRequest request, [Header("Authorization")] string token);
[Get("files/{fileId}")] // 文件下载
Task DownloadFileAsync(string fileId);
```
#### Token管理集成
```csharp
// 定义Token管理器
public interface ITokenManager
{
Task GetTokenAsync();
}
// 使用Header传递Token
[HttpClientApi(TokenManage = nameof(ITokenManager))]
[Header("Authorization")]
public interface IProtectedApi
{
[Get("protected/data")]
Task GetDataAsync();
}
```
#### 按组注册功能
```csharp
[HttpClientApi("https://api.dingtalk.com", RegistryGroupName = "Dingtalk")]
public interface IDingtalkApi
{
[Get("user/info")]
Task GetUserInfoAsync();
}
```
生成独立的注册方法:
```csharp
// 注册钉钉API
services.AddDingtalkWebApiHttpClient();
// 注册微信API
services.AddWechatWebApiHttpClient();
// 注册未分组的API
services.AddWebApiHttpClient();
```
### 3. 依赖注入代码生成
#### 基本使用
```csharp
[ConstructorInject] // 字段构造函数注入
[LoggerInject] // 日志注入
[CacheInject] // 缓存管理器注入
[UserInject] // 用户管理器注入
[CustomInject(VarType = "IRepository", VarName = "_userRepository")] // 自定义注入
public partial class UserService
{
private readonly IRoleRepository _roleRepository;
private readonly IPermissionRepository _permissionRepository;
}
```
#### 自动生成内容
```csharp
public partial class UserService
{
private readonly ILogger _logger;
private readonly ICacheManager _cacheManager;
private readonly IUserManager _userManager;
private readonly IRepository _userRepository;
private readonly IRoleRepository _roleRepository;
private readonly IPermissionRepository _permissionRepository;
public UserService(
ILoggerFactory loggerFactory,
ICacheManager cacheManager,
IUserManager userManager,
IRepository userRepository,
IRoleRepository roleRepository,
IPermissionRepository permissionRepository)
{
_logger = loggerFactory.CreateLogger();
_cacheManager = cacheManager;
_userManager = userManager;
_userRepository = userRepository;
_roleRepository = roleRepository;
_permissionRepository = permissionRepository;
}
}
```
#### 支持的注入特性
| 特性 | 功能 | 说明 |
|------|------|------|
| `[ConstructorInject]` | 字段注入 | 扫描私有只读字段生成构造函数参数 |
| `[LoggerInject]` | 日志注入 | 注入 ILogger 日志记录器 |
| `[CacheInject]` | 缓存注入 | 注入 ICacheManager 缓存管理器 |
| `[UserInject]` | 用户注入 | 注入 IUserManager 用户管理器 |
| `[OptionsInject]` | 配置注入 | 根据指定类型注入配置实例 |
| `[CustomInject]` | 自定义注入 | 注入任意类型的依赖项 |
#### 忽略字段注入
```csharp
[ConstructorInject]
public partial class UserService
{
private readonly IUserRepository _userRepository;
[IgnoreGenerator]
private readonly string _connectionString = "default_connection_string"; // 不会被注入
}
```
### 4. 高级功能
#### COM对象包装
```csharp
[ComObjectWrap]
[ComCollectionWrap]
public interface IMyComObject
{
[ComPropertyWrap]
string Name { get; set; }
[ComPropertyWrap(PropertyType = PropertyType.Method)]
void DoSomething();
}
```
#### 自动服务注册
```csharp
[AutoRegister]
[AutoRegister(ServiceLifetime.Singleton)]
[AutoRegister(ServiceLifetime.Scoped, InterfaceType = typeof(IMyService))]
public class MyService
{
// 服务实现
}
```
#### 抽象类支持
```csharp
[HttpClientApi(IsAbstract = true)]
public abstract class BaseApiClient
{
protected BaseApiClient(HttpClient httpClient, ILogger logger)
{
// 基础初始化逻辑
}
}
[HttpClientApi(InheritedFrom = "BaseApiClient")]
public interface IMyApi : BaseApiClient
{
[Get("data")]
Task GetDataAsync();
}
```
## 配置参数
### 常用配置参数
| 参数名 | 默认值 | 说明 |
|--------|--------|------|
| EmitCompilerGeneratedFiles | false | 是否在obj目录下保存生成的代码 |
| EntitySuffix | Entity | 实体类后缀,用于识别实体类 |
| HttpClientOptionsName | HttpClientOptions | HttpClient配置类名 |
| DefaultLoggerVariable | _logger | 日志变量名默认值 |
| DefaultCacheManagerVariable | _cacheManager | 缓存管理器变量名默认值 |
| DefaultUserManagerVariable | _userManager | 用户管理器变量名默认值 |
### HttpClientApi特性参数
| 参数名 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| BaseAddress | string | null | API 基础地址 |
| Timeout | int | 50 | 请求超时时间(秒) |
| ContentType | string | application/json | 默认内容类型 |
| RegistryGroupName | string | null | 注册分组名称 |
| TokenManage | string | null | Token管理器接口名 |
| IsAbstract | bool | false | 是否生成抽象类 |
| InheritedFrom | string | null | 继承的基类名 |
## 使用方法
### 1. 实体代码生成
```xml
true
Entity
SuppressSniffer
[DtoGenerator]
[Builder]
public partial class UserEntity
{
// 实体字段定义
}
```
### 2. HttpClient API生成
```xml
HttpClientOptions
```
```csharp
// 添加特性到接口
[HttpClientApi("https://api.example.com")]
public interface IUserApi
{
// API方法定义
}
```
### 3. 依赖注入生成
```xml
ICacheManager
IUserManager
```
```csharp
// 添加特性到类
[ConstructorInject]
[LoggerInject]
[CacheInject]
[UserInject]
public partial class UserService
{
// 类字段定义
}
```
## 依赖注入配置
```csharp
// 在 Startup.cs 或 Program.cs 中注册服务
public void ConfigureServices(IServiceCollection services)
{
// 注册Token管理器
services.AddSingleton();
// 配置HttpClient选项
services.Configure(options =>
{
options.BaseUrl = "https://api.example.com";
options.TimeOut = "30";
options.EnableLogging = true;
});
// 注册生成的API客户端
services.AddHttpClient();
}
```
## 生成代码特性
- ✅ **完整的请求逻辑** - 自动处理请求构建、发送、响应解析
- ✅ **错误处理和日志记录** - 自动记录请求日志和错误信息
- ✅ **异步支持** - 支持async/await模式
- ✅ **类型安全** - 强类型的参数和返回值
- ✅ **配置灵活** - 支持通过特性或配置文件配置
- ✅ **生命周期管理** - 正确处理HttpClient和资源释放
- ✅ **Partial方法** - 生成Partial方法支持自定义扩展
- ✅ **零运行时开销** - 编译时代码生成,性能最优
## 查看生成代码
设置 `EmitCompilerGeneratedFiles=true` 后,生成的代码位于:
```
obj/[Configuration]/[TargetFramework]/generated/
```
文件名以 `.g.cs` 结尾。
## 注意事项
1. 使用 `EmitCompilerGeneratedFiles=true` 可以在 obj 目录下查看生成的代码,便于调试
2. 生成的代码文件名以 `.g.cs` 结尾
3. 所有生成的代码都是 partial 类,不会影响您手动编写的代码
4. 建议在实体类和服务类上使用 partial 关键字,以便代码生成器可以扩展它们
## 项目结构
```text
Mud.CodeGenerator
├── Core/
│ ├── Mud.CodeGenerator // 代码生成器核心基类库
│ ├── Mud.EntityCodeGenerator // 实体代码生成器
│ └── Mud.ServiceCodeGenerator // 服务代码生成器
│ ├── HttpInvoke/ // HttpClient API 代码生成器
│ ├── ServiceCode/ // 服务类代码生成器
│ ├── CodeInject/ // 依赖注入代码生成器
│ └── ComWrap/ // COM对象包装生成器
├── Test/
│ ├── CodeGeneratorTest // 代码生成器测试项目
│ └── Mud.Common.CodeGenerator // 通用代码生成器特性定义
├── mudEntityCodeGenerator.md // 实体代码生成器详细文档
├── TokenImplementationSummary.md // Token管理功能实现总结
├── TokenUsageExample.md // Token管理功能使用示例
└── README.md
```
## 维护者
[倔强的泥巴](https://gitee.com/mudtools)
## 许可证
本项目采用MIT许可证模式:[MIT 许可证](LICENSE)
---
> 💡 **提示**: 生成的代码都是 partial 类,不影响手动编写的代码。建议使用 partial 关键字以便代码生成器扩展。编译时自动生成代码,零运行时开销。