如何将ModelStateInvalidFilter添加为全局过滤器?

时间:2018-11-30 02:40:16

标签: c# asp.net-core asp.net-core-mvc

我试图将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.AspNetCore.Mvc.Infrastructure.ModelStateInvalidFilter”时,无法解析类型为“ Microsoft.Extensions.Logging.ILogger”的服务。

我知道泛型ILogger<T>是由框架自动注入的,但是我如何注入非泛型ILogger,它是ModelStateInvalidFilter类的依赖项?

1 个答案:

答案 0 :(得分:1)

使用[ApiController]时,ModelStateInvalidFilter不会从DI容器中解析出来,it's created with 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>());
    });
};

在此示例中,spIServiceProvider的实例,可用于从DI容器请求服务。 ILoggerFactory已为我们注册,因此我们可以请求它并以上面第一个代码段所示的相同方式使用它。