一、依赖注入概述
依赖注入是一种设计模式,用于实现控制反转(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);
}
}
九、依赖注入最佳实践
使用依赖注入的最佳实践。
十、高级特性
包括泛型服务、装饰器模式、条件注册等高级特性。