MoneyTree.DependencyInjection 1.0.4

MoneyTree.DependencyInjection 依赖注入增强

📋 概述

MoneyTree.DependencyInjection 提供自动属性注入和模块化批量服务注册能力,基于 Microsoft.Extensions.DependencyInjection 扩展,大幅减少样板代码,提升开发效率。

属性 说明
NuGet 包 MoneyTree.DependencyInjection
外部依赖 MoneyTree.CoreMicrosoft.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

Version Downloads Last updated
1.0.4 2 7/21/2026
1.0.3 1 7/12/2026