Как добавить ModelStateInvalidFilter в качестве глобального фильтра? - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь добавить ModelStateInvalidFilter в качестве глобального фильтра, чтобы мне не приходилось добавлять атрибут ApiController на каждом контроллере.

Это то, что я делаю в моем автозагрузке

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<ApiBehaviorOptions>();
    services.AddScoped<ModelStateInvalidFilter>();

    services.AddMvc(config => config.Filters.AddService<ModelStateInvalidFilter>())
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);                              
}

Однако я получаю эту ошибку

InvalidOperationException: невозможно разрешить службу для типа «Microsoft.Extensions.Logging.ILogger» при попытке активировать «Microsoft.AspNetCore»..Mvc.Infrastructure.ModelStateInvalidFilter '.

Я знаю, что универсальный ILogger<T> автоматически внедряется платформой, но как мне внедрить неуниверсальный ILogger, который является зависимостью от ModelStateInvalidFilter класс?

1 Ответ

0 голосов
/ 30 ноября 2018

Когда вы используете [ApiController], ModelStateInvalidFilter не разрешается из контейнера DI, создается с new:

_modelStateInvalidFilter = new ModelStateInvalidFilter(
    apiBehaviorOptions.Value,
    loggerFactory.CreateLogger<ModelStateInvalidFilter>());

Для того, чтобы иметь возможностьРешив это из контейнера DI, нам нужно немного более подробно рассказать о том, как мы создаем экземпляр ILogger, что можно сделать при добавлении ModelStateInvalidFilter в контейнер DI, например:

services.AddScoped<ModelStateInvalidFilter>(sp =>
{
    var loggerFactory = sp.GetRequiredService<ILoggerFactory>();

    return new ModelStateInvalidFilter(
        sp.GetRequiredService<ApiBehaviorOptions>(),
        loggerFactory.CreateLogger<ModelStateInvalidFilter>());
    });
};

В этом примере sp является экземпляром IServiceProvider, который мы можем использовать для запроса служб из контейнера DI.ILoggerFactory уже зарегистрирован для нас, поэтому мы можем запросить его и использовать так же, как показано в первом фрагменте кода выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...