我试图将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
类的依赖项?
答案 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>());
});
};
在此示例中,sp
是IServiceProvider
的实例,可用于从DI容器请求服务。 ILoggerFactory
已为我们注册,因此我们可以请求它并以上面第一个代码段所示的相同方式使用它。