🔧 .NET

.NET Core 依赖注入:设计模式与最佳实践

深入探讨.NET Core依赖注入的核心概念、生命周期管理、设计模式应用及最佳实践

一、依赖注入概述

依赖注入是一种设计模式,用于实现控制反转(IoC),降低组件之间的耦合度。

二、服务注册方式

在.NET Core中注册服务的多种方式。

public void ConfigureServices(IServiceCollection services)
{
    // 瞬时服务 - 每次请求创建新实例
    services.AddTransient<ITransientService, TransientService>();
    
    // 作用域服务 - 每个请求创建一个实例
    services.AddScoped<IScopedService, ScopedService>();
    
    // 单例服务 - 整个应用生命周期内共享一个实例
    services.AddSingleton<ISingletonService, SingletonService>();
    
    // 工厂模式注册
    services.AddScoped<IMyService>(sp => {
        var dependency = sp.GetRequiredService<IDependency>();
        return new MyService(dependency);
    });
}

三、生命周期管理

理解不同生命周期的适用场景。

四、构造函数注入

推荐的依赖注入方式。

public class OrderService : IOrderService
{
    private readonly IProductRepository _productRepository;
    private readonly IEventBus _eventBus;
    
    // 构造函数注入
    public OrderService(IProductRepository productRepository, IEventBus eventBus)
    {
        _productRepository = productRepository;
        _eventBus = eventBus;
    }
    
    public async Task CreateOrder(Order order)
    {
        // 使用依赖
    }
}

五、属性注入

属性注入的使用场景和限制。

public class MyController : Controller
{
    [FromServices]
    public ILogger<MyController> Logger { get; set; }
    
    public IActionResult Index()
    {
        Logger.LogInformation("Index action called");
        return View();
    }
}

六、服务定位器模式

谨慎使用服务定位器模式。

public class ServiceLocator
{
    private static IServiceProvider _serviceProvider;
    
    public static void SetServiceProvider(IServiceProvider provider)
    {
        _serviceProvider = provider;
    }
    
    public static T GetService<T>()
    {
        return _serviceProvider.GetService<T>();
    }
}

七、依赖注入设计模式

结合依赖注入应用设计模式。

八、单元测试与依赖注入

依赖注入对单元测试的支持。

[TestClass]
public class OrderServiceTests
{
    [TestMethod]
    public void CreateOrder_ShouldPublishEvent()
    {
        // Arrange
        var mockRepo = new Mock<IProductRepository>();
        var mockBus = new Mock<IEventBus>();
        var service = new OrderService(mockRepo.Object, mockBus.Object);
        
        // Act
        service.CreateOrder(new Order());
        
        // Assert
        mockBus.Verify(b => b.PublishAsync(It.IsAny<OrderCreatedEvent>()), Times.Once);
    }
}

九、依赖注入最佳实践

使用依赖注入的最佳实践。

十、高级特性

包括泛型服务、装饰器模式、条件注册等高级特性。