如何将记录器实例传递给我在ConfigureServices中的自定义ModelBinderProvider?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将记录器实例传递给我在ConfigureServices中的自定义ModelBinderProvider?相关的知识,希望对你有一定的参考价值。
我想使用ASP.NET Core自己的日志记录和DI机制在我的代码中执行一些调试日志记录和跟踪。所以我的ModelBinderProvider看起来像这样:
public class MyOwnModelBinderProvider: // ... bla bla
{
public MyOwnModelBinderProvider(ILogger<MyOwnModelBinderProvider> logger)
{
// .. bla bla
}
}
在Startup.cs中设置自定义ModelBinderProviders的推荐方法如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersAndViews(configure =>
configure.ModelBinderProviders.Insert(0,
new MyOwnModelBinderProvider(/** WHAT TO PUT HERE? **/)));
}
我对此进行了研究,人们已经通过在ConfigureServices方法中调用BuildServiceProvider
来创建服务提供者的单独实例,但是David Fowler was strictly against that因为它可能会创建一个从未释放的服务提供者集合的悬挂实例。
对于我来说,传递一个logger实例也感觉是相当大的开销。我在这里缺少明显的模式吗?我感觉应该容易得多。
答案
我可以想到两种方法:
- 在
GetBinder
中,ModelBinderProviderContext
有一个Services
property。 - 您可以在对
AddControllersAndViews
的调用之外配置MvcOptions:
builder.Services.AddOptions<MvcOptions>()
.Configure<ILoggerFactory>((options, loggerFactory) =>
{
options.ModelBinderProviders.Add(new MyOwnModelBinderProvider(loggerFactory));
});
这使您可以将依赖关系传递给通过选项创建的事物。
以上是关于如何将记录器实例传递给我在ConfigureServices中的自定义ModelBinderProvider?的主要内容,如果未能解决你的问题,请参考以下文章
AngularJs 将 HTML 中每个 ng-repeat 的实例传递给指令
为啥我不能将url中的参数直接传递给我在MVC中的方法(参数始终为null)