如何使用.NET自带的依赖注入 (Dependency Injection, DI)

在.NET Core中,依赖注入(Dependency Injection,DI)是默认集成的,开发者可以非常方便地在项目中配置和使用DI来管理服务依赖关系。以下是具体的使用方法:

1. 配置依赖注入容器

在ASP.NET Core中,可以通过ConfigureServices方法(通常在Startup.cs文件中)注册依赖关系:

public void ConfigureServices(IServiceCollection services)
{
    // 将服务注册为单例生命周期
    services.AddSingleton<IMyService, MyService>();

    // 将服务注册为瞬态生命周期
    services.AddTransient<IOtherService, OtherService>();

    // 将服务注册为范围生命周期
    services.AddScoped<IAnotherService, AnotherService>();
}

三种主要的生命周期

  • Singleton(单例):整个应用程序生命周期内只创建一个实例。例如,数据库上下文类通常配置为单例,以避免重复连接。
  • Scoped(作用域):在每次HTTP请求的生命周期内创建一次实例。该生命周期适用于Web应用程序中的服务,比如中间件和用户认证。
  • Transient(瞬态):每次请求该服务时都会创建新的实例,适用于轻量的、无状态的服务​。

2. 通过构造函数注入依赖

构造函数注入是DI最常用的形式。可以通过构造函数参数,将服务注入到类中,并在类内部进行使用:

public class MyController : Controller
{
    private readonly IMyService _myService;

    public MyController(IMyService myService)
    {
        _myService = myService;
    }

    public IActionResult Index()
    {
        _myService.DoWork();
        return View();
    }
}

在上面的代码中,IMyService接口的实现被注入到MyController,_myService变量可以在Index方法中调用​。

3. 使用 IServiceProvider 手动获取服务

在少数情况下,可能需要在运行时手动获取依赖服务。可以通过IServiceProvider接口实现,例如在中间件或启动类中:

public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
{
    var myService = serviceProvider.GetService<IMyService>();
    myService.DoWork();
}

不过,手动获取依赖并不推荐,除非无法在构造函数中注入。

4. 使用 Options Pattern 管理复杂配置

使用IOptions<T>注入复杂配置,例如从appsettings.json文件读取的配置信息。首先定义配置类并绑定到配置项,然后通过IOptions<T>接口注入到需要使用配置的类中:

// 定义配置类
public class MySettings
{
    public string Setting1 { get; set; }
    public int Setting2 { get; set; }
}

// 在Startup中绑定配置
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MySettings>(_configuration.GetSection("MySettings"));
}

// 在类中使用配置
public class MyController : Controller
{
    private readonly MySettings _settings;

    public MyController(IOptions<MySettings> options)
    {
        _settings = options.Value;
    }
}

5. 注册自定义中间件和过滤器

ASP.NET Core允许通过依赖注入配置自定义中间件或过滤器。可以将中间件注册为服务,并在Configure方法中添加到中间件管道中,确保按顺序执行。

.NET Core内置的DI框架提供了灵活且高效的依赖注入管理方法,适用于开发各类Web应用程序和微服务架构。借助这些方法可以轻松构建模块化、松耦合的应用程序,从而提高代码的可读性和可维护性​。

评论