c# - 如何将记录器实例传递给ConfigureServices中的自定义ModelBinderProvider?

标签 c# asp.net-core dependency-injection

我想使用 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因为它可能会创建一个服务提供者集合的挂起实​​例,并且永远不会释放。

仅仅传递一个记录器实例对我来说也是相当大的开销。我在这里错过了一个明显的模式吗?我感觉应该容易多了。

最佳答案

我可以想到两种方法来做到这一点:

  1. GetBinder 中,ModelBinderProviderContext 有一个 Services property .
  2. 您可以在调用 AddControllersAndViews 之外配置 MvcOptions:
builder.Services.AddOptions<MvcOptions>()
                .Configure<ILoggerFactory>((options, loggerFactory) =>
                {
                    options.ModelBinderProviders.Add(new MyOwnModelBinderProvider(loggerFactory));
                });

这使您可以将依赖项传递给通过选项创建的事物。

关于c# - 如何将记录器实例传递给ConfigureServices中的自定义ModelBinderProvider?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59539927/

相关文章:

c# - 如何使用pop3 c#阅读最新的电子邮件

c# - 如何将 EF Core 相关集合中的属性的 IsModified 设置为 false?

c# - 在调试中为 SSL 配置 launchSettings.json - ASP.NET Core/Visual Studio Code

jquery - 确认删除模式/对话框,Twitter Bootstrap 不起作用

c# - Ninject.MVC 构造函数注入(inject),其中注入(inject)对象的构造函数采用参数

c# - 如何在 MVC 4 中使用 HTML anchor ?

c# - 要删除的节点不是该节点的子节点

c# - 如何获取 ComboBox 的值而不是文本

c# - 在 Asp.Net Core 2 中将 SignInManager 和 AspNetUserManager 注入(inject)中间件

typescript - 无法使用 DI 注入(inject)类