.net核心中带有构造函数参数的依赖项注入

本文关键字:依赖 注入 参数 构造函数 核心 net | 更新日期: 2023-09-27 17:59:28

我看到了很多关于如何在.NET Core中使用DI的代码示例,但没有一个使用构造函数参数。

例如:

  • 创建授权服务
  • 在构造函数中注入当前HTTP标头(X-Api-Key)
  • 在实施检查中,如果我有访问权限

在这里,我不仅需要在IAuthorizationService上使用DI,还需要在构造函数中注入令牌。我知道如何在Ninject中做到这一点,但没有.NET Core DI的经验。

以下是我举的一个例子。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddEntityFrameworkSqlite();
    services.AddDbContext<MainDbContext>();
    services.AddScoped<IAuthorizationService, AuthorizationService>(); // Inject current HttpContext header value as a constructor?
}

.net核心中带有构造函数参数的依赖项注入

我通常通过在中间件中设置数据的服务来传递这些值。例如:

可以注入的访问器类:

public class ApiKeyAccessor
{
    public string ApiKey { get; set; }
}

以及在请求开始时设置API密钥的中间件:

public class ApiKeyMiddleware
{
    private readonly RequestDelegate _next;
    public ApiKeyMiddleware(RequestDelegate next)
    {
        _next = next;
    }
    public Task Invoke(HttpContext context, ApiKeyAccessor apiKeyAccessor)
    {
        StringValues key;
        if (context.Request.Headers.TryGetValue("X-Api-Key", out key))
        {
            apiKeyAccessor.ApiKey = key;
            return _next(context);
        }
        // todo: throw exception, etc..
    }
}

现在,我们所要做的就是将ApiKeyAccessor添加到具有作用域生存期的DI容器中,并将ApiKeyMiddleware添加到请求执行管道中,最好是尽快添加。

如果配置正确,我们可以在控制器或服务中注入ApiKeyAccessor实例:

public class AuthorizationService
{
   private readonly string _apiKey;
   public AuthorizationService(ApiKeyAccessor apiKeyAccessor)
   {
      _apiKey = apiKeyAccessor.ApiKey;
   }
}