【发布时间】:2021-03-09 02:22:50
【问题描述】:
我的Startup 类中有以下代码,它使用IModelBinderProvider 的自定义实例。大多数输入格式化程序需要一个ILogger 实例,所以我需要一个ILoggerFactory,为此我想使用配置的,它以指定的详细程度记录到指定的目标。我正在从新建的IServiceProvider 中获取ILoggerFactory:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddMvcCore(
options =>
{
...
var serviceProvider = services.BuildServiceProvider();
var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
options.ModelBinderProviders.Clear();
options.ModelBinderProviders.Add(
new MyCustomBinderProvider(options.InputFormatters, loggerFactory)
);
...
}
);
...
}
问题是我收到以下警告:
Startup.cs(62, 43): [ASP0000] Calling 'BuildServiceProvider' from application code results in an
additional copy of singleton services being created. Consider alternatives such
as dependency injecting services as parameters to 'Configure'.
我看了一下这个问题:Resolving instances with ASP.NET Core DI from within ConfigureServices。但是,我的代码是 AddMvcCore 的 lambda,它正在配置 options 对象。换句话说,在调用Configure 时,MVC 选项已经定义好了。
有没有办法在这里做正确的事情,即防止IServiceProvider 的无关实例?
【问题讨论】:
-
谢谢@Nkosi。我的自定义绑定提供程序受到
BodyModelBinderProvider的启发,它接受ILoggerFactory作为输入。事实上,BodyModelBinderProvider的实例已经存在,我不得不调用Clear的原因。如果 ASP.NET Core 能够及早解决 logger factory,我想我应该也可以这样做...
标签: asp.net-mvc asp.net-core dependency-injection asp.net-core-mvc asp.net-core-3.1