通过DI

时间:2018-09-23 17:57:12

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

我使用JWT承载令牌来保护我的ASP.NET Core 2.1 Web API。在ConfigureServices期间,我设置了身份验证,并通过选项绑定了JwtBeaererEvents对象以进行其他处理。我希望该对象成为DI容器的一部分,但是我不确定该怎么做。现在,我必须创建实例并将其通过构造函数(反模式)传递。但这将创建一个鸡加蛋的场景:

/* HACK */
var sp = services.BuildServiceProvider();

services.AddAuthentication(opts =>
{
    opts.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(opts =>
{                
    opts.Audience = "https://foobar.com/FooAPI";
    opts.Authority = Constants.AuthEndpointPrefix + "common/";
    opts.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false };

    /* I would like JwtBearerEvents to be part of the 
       DI container and request the Logger and AppInsights 
       Dependency through the ctor 
    */
    opts.Events = new 
       JwtBearerEvents(
          LoggerFactory.CreateLogger<JwtBearerEvents>(),
          sp.GetService<TelemetryClient>() 
       );  
    });     

1 个答案:

答案 0 :(得分:3)

ASP.NET Core 2中的身份验证系统使用身份验证方案选项的EventsType property本机支持此操作:

services.AddTransient<MyJwtBearerEvents>();
services.AddAuthentication()
    .AddJwtBearer(options =>
    {
        options.EventsType = typeof(MyJwtBearerEvents);
    });

如果设置了此属性,则在请求开始时初始化身份验证方案时,事件实例将得到解析。

除此之外,请注意,您还可以访问作为事件上下文的一部分传递的HttpContext实例,并使用服务定位器模式来解析事件处理程序中的服务。尽管通常不是最好的服务定位器,但是如果您只需要为特定事件类型提供某些依赖项,它可以在这种情况下为您提供更多的灵活性。