.net core 3 сервисы внедрения зависимостей в качестве параметров для «настройки» - PullRequest
1 голос
/ 03 октября 2019

Я только что обновил базовое приложение .net с версии 2.2 до 3. Внутри метода ConfigureServices в файле startup.cs мне нужно разрешить службу, которая используется службой аутентификации. Я «собирал» все сервисы, используя «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...
            };
        }
}

1 Ответ

1 голос
/ 03 октября 2019

, но .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();
...