MoneyTree.DependencyInjection 1.0.4
MoneyTree.DependencyInjection 依赖注入增强
📋 概述
MoneyTree.DependencyInjection 提供自动属性注入和模块化批量服务注册能力,基于 Microsoft.Extensions.DependencyInjection 扩展,大幅减少样板代码,提升开发效率。
| 属性 | 说明 |
|---|---|
| NuGet 包 | MoneyTree.DependencyInjection |
| 外部依赖 | MoneyTree.Core、Microsoft.Extensions.DependencyInjection |
| 定位 | 自动属性注入与模块化服务注册 |
🏗️ 项目文件结构
MoneyTree.DependencyInjection/
├── MoneyTree.DependencyInjection.csproj
├── GlobalUsings.cs
├── Abstractions/
│ └── IPropertyInjector.cs # 属性注入器接口(兼容层)
├── Core/
│ ├── PropertyInjector.cs # 属性注入器实现(委托到 InjectHelper)
│ └── InjectHelper.cs # 属性注入辅助(静态扩展,主力通道)
└── Extensions/
├── DependencyInjectionExtensions.cs # 依赖注入扩展(扫描+IoC注册)
├── ServiceCollectionExtensions.cs # 服务集合扩展
└── ModuleExtensions.cs # 模块注册扩展(含命名空间扫描)
🚀 快速开始
启用自动属性注入
// Program.cs
using System.Reflection;
using MoneyTree.DependencyInjection.Extensions;
var builder = WebApplication.CreateBuilder(args);
// 扫描程序集注册服务(Service/Repository/Handler/[IoC]类/Module)
builder.Services.AddMoneyTreeAutoInjection(options =>
{
options.ScanFromAssembly(Assembly.GetExecutingAssembly());
});
var app = builder.Build();
app.Run();
注入机制:
[IoC]标记的类通过工厂方法创建实例后,自动调用InjectHelper.InjectProperties(this)完成属性注入。直接从工厂的IServiceProvider参数(当前作用域)解析属性,避免跨作用域问题。
📖 使用示例
属性标记注入
通过 [IoCAttribute] 标记类,[Inject] 特性标记属性:
[IoC]
public class OrderService
{
[Inject] public ILogger<OrderService> Logger { get; set; } = default!;
[Inject] public ICurrentUser CurrentUser { get; set; } = default!;
}
Keyed 属性注入(命名解析)
[Inject(KeyName = "xxx")] 配合 [IoC(RegistrationName = "xxx")] 实现同一接口多实现的精确注入:
// 注册端:两个 IPaymentProvider 实现
[IoC(InterfaceType = typeof(IPaymentProvider), RegistrationName = "Alipay")]
public class AlipayProvider : IPaymentProvider { }
[IoC(InterfaceType = typeof(IPaymentProvider), RegistrationName = "WeChat")]
public class WeChatProvider : IPaymentProvider { }
// 消费端:按 KeyName 精确注入
[IoC]
public class PaymentService
{
[Inject(KeyName = "Alipay")] public IPaymentProvider Alipay { get; set; } = default!;
[Inject(KeyName = "WeChat")] public IPaymentProvider WeChat { get; set; } = default!;
}
解析机制:
InjectHelper检测[Inject(KeyName)]后自动切换为GetKeyedService, 未指定KeyName时使用普通GetService按类型解析。
接口注册与多实现
// 注册为指定接口
[IoC(InterfaceType = typeof(IOrderService))]
public class OrderService : IOrderService { }
// 同一类注册多个接口
[IoC(InterfaceType = typeof(IOrderService))]
[IoC(InterfaceType = typeof(IDomainService))]
public class OrderService : IOrderService, IDomainService { }
// 单接口多实现 — 命名注册(Keyed)
[IoC(InterfaceType = typeof(IPaymentProvider), RegistrationName = "Alipay")]
public class AlipayProvider : IPaymentProvider { }
// Singleton 生命周期
[IoC(Lifetime = ServiceLifetime.Singleton)]
public class CacheManager { }
模块化注册
通过 IModule 接口将相关服务打包成一个模块,实现批量注册:
// 定义模块
public class OrderModule : IModule
{
public void Configure(IServiceCollection services)
{
services.AddScoped<IOrderService, OrderService>();
services.AddScoped<IOrderRepository, OrderRepository>();
}
}
// 注册模块
builder.Services.AddModule<OrderModule>();
多程序集扫描
builder.Services.AddMoneyTreeAutoInjection(options =>
{
options.ScanFromAssembly(Assembly.GetExecutingAssembly())
.ScanFromAssembly(typeof(UserModule).Assembly);
});
🎯 注入约定
| 约定 | 说明 |
|---|---|
| 类标记 | [IoC] 特性标记的类自动注册并启用属性注入 |
| 属性标记 | [Inject] 特性标记需要注入的属性 |
| Keyed 注入 | [Inject(KeyName = "xxx")] 配合 [IoC(RegistrationName)] 按命名解析 |
| 可选注入 | [Inject(Required = false)] 声明可选依赖,容器中不存在时不报错 |
| 接口注册 | [IoC(InterfaceType = typeof(IMyService))] 注册为指定接口 |
| 命名注册 | [IoC(InterfaceType = typeof(IFoo), RegistrationName = "key")] Keyed 服务 |
| 多生命周期 | [IoC(Lifetime = ServiceLifetime.Singleton/Scoped/Transient)] 默认 Scoped |
| 自动注入 | 工厂方法中通过 InjectHelper.InjectProperties(this) 自动完成 |
Showing the top 20 packages that depend on MoneyTree.DependencyInjection.
| Packages | Downloads |
|---|---|
|
MoneyTree.Web
MoneyTree Framework Web 集成模块。提供静态启动入口、中间件管道、SSE支持、SignalR兼容、NLog默认日志。
|
1 |
.NET 10.0
- MoneyTree.Core (>= 1.0.4)
- Microsoft.Extensions.DependencyInjection (>= 10.0.10)
- Microsoft.Extensions.Hosting.Abstractions (>= 10.0.10)
- Scrutor (>= 7.0.0)