.net core 3 依赖注入服务作为“配置”的参数

Luc*_*gon 6 c# dependency-injection asp.net-core

我刚刚将 .net 核心应用程序从版本 2.2 升级到 3。在 startup.cs 的 ConfigureServices 方法中,我需要解析身份验证服务使用的服务。我正在使用“services.BuildServiceProvider()”“构建”所有服务,但 .net core 3 抱怨创建额外服务副本的方法,并建议我将依赖注入服务作为“配置”的参数。我不知道这个建议是什么意思,我想了解它。

public virtual void ConfigureServices(IServiceCollection services)
{
    // Need to resolve this.
    services.AddSingleton<IManageJwtAuthentication, JwtAuthenticationManager>();

    var sp = services.BuildServiceProvider(); // COMPLAINING HERE!!
    var jwtAuthManager = sp.GetRequiredService<IManageJwtAuthentication>();

    services
        .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(c =>
        {
            c.TokenValidationParameters = new TokenValidationParameters
            {
                AudienceValidator = jwtAuthManager.AudienceValidator,
                // More code here...
            };
        }
}
Run Code Online (Sandbox Code Playgroud)

itm*_*nus 10

但是 .net core 3 抱怨创建额外服务副本的方法,并建议我将依赖注入服务作为“配置”的参数。

实际上,ServiceCollection.BuildServiceProvider()应该由主机自动调用。您的代码services.BuildServiceProvider();将创建一个与默认服务提供者不同重复服务提供者,这可能会导致服务状态不一致在此处查看由多个服务提供者引起的错误

要解决此问题,请使用依赖项注入配置选项,而不是创建服务提供者然后定位服务。

对于您的代码,将它们重写如下:

services.AddSingleton<IManageJwtAuthentication, JwtAuthenticationManager>();

services.AddOptions<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme)
    .Configure<IManageJwtAuthentication>((opts,jwtAuthManager)=>{
        opts.TokenValidationParameters = new TokenValidationParameters
        {
            AudienceValidator = jwtAuthManager.AudienceValidator,
            // More code here...
        };
    });

services
    .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer();
Run Code Online (Sandbox Code Playgroud)