在 .NET Core 中使用构造函数参数进行依赖注入

11

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

你看过这份文档吗?(https://docs.asp.net/en/latest/fundamentals/dependency-injection.html) - Sam I am says Reinstate Monica
你需要注入 token,还是可以注入提供 token 的类的接口? - Scott Hannen
@ScottHannen 嗯,我想这并不重要。然而,如果使用“token”,那么测试将更容易。 - Stan
我的通用解决方案:https://gist.github.com/ReallyLiri/c669c60db2109554d5ce47e03613a7a9 - Mugen
1个回答

8

我通常将这些值通过一个服务进行流动,其中数据被设置在一个中间件中。例如:

可注入的访问器类:

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容器中,生命周期为scoped,并尽可能早地将ApiKeyMiddleware添加到请求执行管道中即可。配置正确后,我们可以在控制器或服务中注入ApiKeyAccessor实例。
public class AuthorizationService
{
   private readonly string _apiKey;

   public AuthorizationService(ApiKeyAccessor apiKeyAccessor)
   {
      _apiKey = apiKeyAccessor.ApiKey;
   }
}

2
我喜欢这种方式——注入一个类——比注入一个值更好,除非该值是像连接字符串这样不变的东西。对于任何给定的 DI 容器,通常注入一个类比配置容器在运行时检索一个值更容易。 - Scott Hannen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接