Mud.ServiceCodeGenerator
1.2.0
See the version list below for details.
dotnet add package Mud.ServiceCodeGenerator --version 1.2.0
NuGet\Install-Package Mud.ServiceCodeGenerator -Version 1.2.0
<PackageReference Include="Mud.ServiceCodeGenerator" Version="1.2.0" />
<PackageVersion Include="Mud.ServiceCodeGenerator" Version="1.2.0" />
<PackageReference Include="Mud.ServiceCodeGenerator" />
paket add Mud.ServiceCodeGenerator --version 1.2.0
#r "nuget: Mud.ServiceCodeGenerator, 1.2.0"
#:package Mud.ServiceCodeGenerator@1.2.0
#addin nuget:?package=Mud.ServiceCodeGenerator&version=1.2.0
#tool nuget:?package=Mud.ServiceCodeGenerator&version=1.2.0
Mud 服务代码生成器
功能介绍
Mud 服务代码生成器是一个基于 Roslyn 的源代码生成器,用于自动生成服务层相关代码,提高开发效率。它包含以下主要功能:
- 服务类代码生成 - 根据实体类自动生成服务接口和服务实现类
- 依赖注入代码生成 - 自动为类生成构造函数注入代码,包括日志、缓存、用户管理等常用服务
项目参数配置
在使用 Mud 服务代码生成器时,可以通过在项目文件中配置以下参数自定义生成行为:
通用配置参数
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<DefaultCacheManagerType>ICacheManager</DefaultCacheManagerType>
<DefaultUserManagerType>IUserManager</DefaultUserManagerType>
<DefaultLoggerVariable>_logger</DefaultLoggerVariable>
<DefaultCacheManagerVariable>_cacheManager</DefaultCacheManagerVariable>
<DefaultUserManagerVariable>_userManager</DefaultUserManagerVariable>
<ServiceGenerator>true</ServiceGenerator>
<EntitySuffix>Entity</EntitySuffix>
<ImpAssembly>Mud.System</ImpAssembly>
<EntityAttachAttributes>SuppressSniffer</EntityAttachAttributes>
</PropertyGroup>
<ItemGroup>
<CompilerVisibleProperty Include="DefaultCacheManagerType" />
<CompilerVisibleProperty Include="DefaultUserManagerType" />
<CompilerVisibleProperty Include="DefaultLoggerVariable" />
<CompilerVisibleProperty Include="DefaultCacheManagerVariable" />
<CompilerVisibleProperty Include="DefaultUserManagerVariable" />
<CompilerVisibleProperty Include="ServiceGenerator" />
<CompilerVisibleProperty Include="EntitySuffix" />
<CompilerVisibleProperty Include="ImpAssembly" />
<CompilerVisibleProperty Include="EntityAttachAttributes" />
</ItemGroup>
依赖项配置
<ItemGroup>
<PackageReference Include="Mud.ServiceCodeGenerator" Version="1.1.6"/>
</ItemGroup>
代码生成功能及样例
依赖注入代码生成
使用各种注入特性为类自动生成构造函数注入代码:
[ConstructorInject] // 字段构造函数注入
[LoggerInject] // 日志注入
[CacheInject] // 缓存管理器注入
[UserInject] // 用户管理器注入
[CustomInject(VarType = "IRepository<SysUser>", VarName = "_userRepository")] // 自定义注入
public partial class SysUserService
{
// 生成的代码将包含以下内容:
// 1. 构造函数参数
// 2. 私有只读字段
// 3. 构造函数赋值语句
}
自动服务注册代码生成
使用 [AutoRegister] 和 [AutoRegisterKeyed] 特性自动生成服务注册代码,简化依赖注入配置:
// 自动注册服务到DI容器
[AutoRegister]
[AutoRegister<ISysUserService>]
[AutoRegisterKeyed<ISysUserService>("user")]
public partial class SysUserService : ISysUserService
{
// 生成的代码将包含服务注册扩展方法
}
构造函数注入详解
ConstructorInjectAttribute 字段注入
使用 [ConstructorInject] 特性可以将类中已存在的字段通过构造函数注入初始化。该注入方式会扫描类中的所有私有只读字段,并为其生成相应的构造函数参数和赋值语句。
示例:
[ConstructorInject]
public partial class UserService
{
private readonly IUserRepository _userRepository;
private readonly IRoleRepository _roleRepository;
// 生成的代码将包含:
public UserService(IUserRepository userRepository, IRoleRepository roleRepository)
{
_userRepository = userRepository;
_roleRepository = roleRepository;
}
}
LoggerInjectAttribute 日志注入
使用 [LoggerInject] 特性可以为类注入 ILogger<> 类型的日志记录器。该注入会自动生成 ILoggerFactory 参数,并在构造函数中创建对应类的 Logger 实例。
示例:
[LoggerInject]
public partial class UserService
{
// 生成的代码将包含:
private readonly ILogger<UserService> _logger;
public UserService(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<UserService>();
}
}
CacheInjectAttribute 缓存管理器注入
使用 [CacheInject] 特性可以注入缓存管理器实例。默认类型为 ICacheManager,默认字段名为 _cacheManager,可通过项目配置修改。
示例:
[CacheInject]
public partial class UserService
{
// 生成的代码将包含:
private readonly ICacheManager _cacheManager;
public UserService(ICacheManager cacheManager)
{
_cacheManager = cacheManager;
}
}
项目配置示例:
<PropertyGroup>
<DefaultCacheManagerType>MyCustomCacheManager</DefaultCacheManagerType>
<DefaultCacheManagerVariable>_myCacheManager</DefaultCacheManagerVariable>
</PropertyGroup>
UserInjectAttribute 用户管理器注入
使用 [UserInject] 特性可以注入用户管理器实例。默认类型为 IUserManager,默认字段名为 _userManager,可通过项目配置修改。
示例:
[UserInject]
public partial class UserService
{
// 生成的代码将包含:
private readonly IUserManager _userManager;
public UserService(IUserManager userManager)
{
_userManager = userManager;
}
}
项目配置示例:
<PropertyGroup>
<DefaultUserManagerType>MyCustomUserManager</DefaultUserManagerType>
<DefaultUserManagerVariable>_myUserManager</DefaultUserManagerVariable>
</PropertyGroup>
OptionsInjectAttribute 配置项注入
使用 [OptionsInject] 特性可以根据指定的配置项类型注入配置实例。支持泛型语法,提供更简洁的配置方式。
示例:
// 传统方式
[OptionsInject(OptionType = "TenantOptions")]
// 泛型方式(推荐)
[OptionsInject<TenantOptions>]
public partial class UserService
{
// 生成的代码将包含:
private readonly TenantOptions _tenantOptions;
public UserService(IOptions<TenantOptions> tenantOptions)
{
_tenantOptions = tenantOptions.Value;
}
}
CustomInjectAttribute 自定义注入
使用 [CustomInject] 特性可以注入任意类型的依赖项。支持泛型语法,提供更简洁的类型安全配置方式。
示例:
// 传统方式
[CustomInject(VarType = "IRepository<SysUser>", VarName = "_userRepository")]
[CustomInject(VarType = "INotificationService", VarName = "_notificationService")]
// 泛型方式(推荐)
[CustomInject<IRepository<SysUser>>(VarName = "_userRepository")]
[CustomInject<INotificationService>(VarName = "_notificationService")]
public partial class UserService
{
// 生成的代码将包含:
private readonly IRepository<SysUser> _userRepository;
private readonly INotificationService _notificationService;
public UserService(IRepository<SysUser> userRepository, INotificationService notificationService)
{
_userRepository = userRepository;
_notificationService = notificationService;
}
}
组合注入示例
多种注入特性可以组合使用,生成器会自动合并所有注入需求。推荐使用泛型语法以获得更好的类型安全性:
[ConstructorInject]
[LoggerInject]
[CacheInject]
[UserInject]
[OptionsInject<TenantOptions>]
[CustomInject<IRepository<SysUser>>(VarName = "_userRepository")]
public partial class UserService
{
private readonly IRoleRepository _roleRepository;
private readonly IPermissionRepository _permissionRepository;
// 生成的代码将包含所有注入项:
private readonly ILogger<UserService> _logger;
private readonly ICacheManager _cacheManager;
private readonly IUserManager _userManager;
private readonly TenantOptions _tenantOptions;
private readonly IRepository<SysUser> _userRepository;
private readonly IRoleRepository _roleRepository;
private readonly IPermissionRepository _permissionRepository;
public UserService(
ILoggerFactory loggerFactory,
ICacheManager cacheManager,
IUserManager userManager,
IOptions<TenantOptions> tenantOptions,
IRepository<SysUser> userRepository,
IRoleRepository roleRepository,
IPermissionRepository permissionRepository)
{
_logger = loggerFactory.CreateLogger<UserService>();
_cacheManager = cacheManager;
_userManager = userManager;
_tenantOptions = tenantOptions.Value;
_userRepository = userRepository;
_roleRepository = roleRepository;
_permissionRepository = permissionRepository;
}
}
自动服务注册代码生成
AutoRegisterSourceGenerator 自动为标记了 [AutoRegister] 和 [AutoRegisterKeyed] 特性的类生成服务注册代码,简化依赖注入配置。
AutoRegisterAttribute 自动注册
使用 [AutoRegister] 特性自动将服务注册到DI容器中:
// 基本用法:注册实现类本身
[AutoRegister]
public class UserService
{
// 生成的注册代码:services.AddScoped<UserService>();
}
// 注册为接口实现
[AutoRegister<IUserService>]
public class UserService : IUserService
{
// 生成的注册代码:services.AddScoped<IUserService, UserService>();
}
// 指定生命周期
[AutoRegister(ServiceLifetime.Singleton)]
[AutoRegister<IUserService>(ServiceLifetime.Transient)]
public class UserService : IUserService
{
// 生成的注册代码:
// services.AddSingleton<UserService>();
// services.AddTransient<IUserService, UserService>();
}
AutoRegisterKeyedAttribute 键控服务注册
使用 [AutoRegisterKeyed] 特性注册键控服务(Microsoft.Extensions.DependencyInjection 8.0+):
// 键控服务注册
[AutoRegisterKeyed("user")]
[AutoRegisterKeyed<IUserService>("user")]
public class UserService : IUserService
{
// 生成的注册代码:
// services.AddKeyedScoped<UserService>("user");
// services.AddKeyedScoped<IUserService, UserService>("user");
}
// 键控服务指定生命周期
[AutoRegisterKeyed<IUserService>("user", ServiceLifetime.Singleton)]
public class UserService : IUserService
{
// 生成的注册代码:services.AddKeyedSingleton<IUserService, UserService>("user");
}
生成的注册代码
自动生成的注册扩展方法位于 AutoRegisterExtension 类中:
// 自动生成的代码
public static partial class AutoRegisterExtension
{
/// <summary>
/// 自动注册标注的服务
/// </summary>
public static IServiceCollection AddAutoRegister(this IServiceCollection services)
{
services.AddScoped<UserService>();
services.AddScoped<IUserService, UserService>();
services.AddKeyedScoped<UserService>("user");
services.AddKeyedScoped<IUserService, UserService>("user");
return services;
}
}
使用方式
在应用程序启动时调用生成的扩展方法:
var builder = WebApplication.CreateBuilder(args);
// 自动注册所有标记的服务
builder.Services.AddAutoRegister();
// 或者与其他注册一起使用
builder.Services
.AddControllers()
.AddAutoRegister();
特性组合使用
自动注册特性可以与其他注入特性组合使用:
[AutoRegister<IUserService>]
[ConstructorInject]
[LoggerInject]
[CacheInject]
public class UserService : IUserService
{
private readonly IUserRepository _userRepository;
// 同时生成构造函数注入和服务注册代码
}
忽略字段注入
对于某些不需要通过构造函数注入的字段,可以使用 [IgnoreGenerator] 特性标记:
[ConstructorInject]
public partial class UserService
{
private readonly IUserRepository _userRepository;
[IgnoreGenerator]
private readonly string _connectionString = "default_connection_string"; // 不会被注入
// 只有_userRepository会被构造函数注入
}
生成代码查看
要查看生成的代码,可以在项目文件中添加以下配置:
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
</PropertyGroup>
生成的代码将位于 obj/[Configuration]/[TargetFramework]/generated/ 目录下,文件名以 .g.cs 结尾。
维护者
许可证
本项目采用MIT许可证模式:
免责声明
本项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任。
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Mud.ServiceCodeGenerator:
| Package | Downloads |
|---|---|
|
Mud.Feishu
MudFeishu 用于简化.NET与飞书(Feishu)API 集成。提供一组类型安全的客户端和服务,便于在 .NET 应用程序中调用飞书 API。 |
|
|
Mud.Feishu.Abstractions
Mud.Feishu.Abstractions 是 MudFeishu 库的 WebSocket 事件订阅和 Webhook 事件订阅组件抽象层,专门用于处理飞书事件订阅。它提供了基于策略模式的完整事件处理机制,使开发人员能够轻松地在 .NET 应用程序中接收和处理飞书实时事件。 |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated | |
|---|---|---|---|
| 1.3.9 | 93 | 12/11/2025 | |
| 1.3.8 | 117 | 12/10/2025 | |
| 1.3.7 | 284 | 12/5/2025 | |
| 1.3.6 | 448 | 12/1/2025 | |
| 1.3.5 | 330 | 11/30/2025 | |
| 1.3.4 | 135 | 11/28/2025 | |
| 1.3.3 | 186 | 11/27/2025 | |
| 1.3.2 | 194 | 11/25/2025 | |
| 1.3.1 | 171 | 11/25/2025 | |
| 1.3.0 | 244 | 11/24/2025 | |
| 1.2.9 | 194 | 11/23/2025 | |
| 1.2.8 | 385 | 11/21/2025 | |
| 1.2.7 | 469 | 11/19/2025 | |
| 1.2.6 | 458 | 11/18/2025 | |
| 1.2.5 | 345 | 11/17/2025 | |
| 1.2.4 | 336 | 11/12/2025 | |
| 1.2.3 | 251 | 11/6/2025 | |
| 1.2.2 | 251 | 11/4/2025 | |
| 1.2.1 | 257 | 10/31/2025 | |
| 1.2.0 | 470 | 10/28/2025 | |
| 1.1.9 | 466 | 10/15/2025 | |
| 1.1.8 | 449 | 10/9/2025 | |
| 1.1.7 | 394 | 10/4/2025 | |
| 1.1.6 | 465 | 9/30/2025 | |
| 1.1.5 | 476 | 9/29/2025 | |
| 1.1.4 | 443 | 7/11/2025 | |
| 1.1.3 | 265 | 12/31/2024 | |
| 1.1.2 | 235 | 12/30/2024 | |
| 1.1.1 | 227 | 12/30/2024 | |
| 1.1.0 | 232 | 12/29/2024 | |
| 1.0.9.4 | 230 | 12/28/2024 | |
| 1.0.9.3 | 237 | 12/28/2024 | |
| 1.0.9.1 | 242 | 12/26/2024 | |
| 1.0.9 | 232 | 12/26/2024 | |
| 1.0.8 | 236 | 12/25/2024 | |
| 1.0.7 | 236 | 12/25/2024 | |
| 1.0.6 | 232 | 12/25/2024 | |
| 1.0.5 | 237 | 12/25/2024 | |
| 1.0.4 | 233 | 12/25/2024 | |
| 1.0.3 | 234 | 12/25/2024 | |
| 1.0.2 | 236 | 12/25/2024 | |
| 1.0.1 | 235 | 12/25/2024 | |
| 0.3.1 | 242 | 12/26/2024 |