如何将记录器实例传递给我在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实例也感觉是相当大的开销。我在这里缺少明显的模式吗?我感觉应该容易得多。

答案

我可以想到两种方法:

  1. GetBinder中,ModelBinderProviderContext有一个Services property
  2. 您可以在对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)

如何将 UIViewController 实例传递给自定义 UITableCell

如何将房间实例传递给 JobService?

如何将类实例传递给 LowLevelMouseProc?

JSDoc:如何记录返回传递的构造函数实例的函数?