【问题标题】:Dependency injection with constructor parameter in .net core在.net核心中使用构造函数参数进行依赖注入
【发布时间】:2016-12-07 00:33:52
【问题描述】:

我看到很多关于如何在 .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?
}

【问题讨论】:

标签: c# dependency-injection asp.net-core .net-core


【解决方案1】:

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

可以注入的访问器类:

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;
   }
}

【讨论】:

  • 我喜欢这个——注入一个类——而不是注入一个值,除非这个值是像连接字符串一样不变的东西。对于任何给定的 DI 容器,注入类通常比配置容器在运行时检索值更容易。
猜你喜欢
  • 2019-02-16
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多