gpt4 book ai didi

c# - 无法解析 ILogger 简单注入(inject)器 ASP.NET Core 2.0

转载 作者:太空狗 更新时间:2023-10-29 22:35:44 25 4
gpt4 key购买 nike

我们在 ASP.NET Core 应用程序中使用 Simple Injector。最近我们决定使用 Serilog 进行日志记录。

配置是在 Program.cs 中完成的,如他们的 documentation 中所述.那么,为了让Simple Injector能够解析ILoggerFactory我做了这样的事情:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();

// As per my understanding, we force SimpleInjector to use
// ILoggerFactory registration from IApplicationBuilder
container.CrossWire<ILoggerFactory>(app)
}

之后ILoggerFactory可以在我们使用它的任何地方注入(inject)。它工作正常(创建新实例 ILogger<T> )。

但这很烦人,每次我们需要时都从工厂创建实例。最好得到ILogger<T>直接在依赖类中,而不是 ILoggerFactory .

那么,我该如何注册 ILogger<T>在下面的情况下获取实例?

public class HelloWorldController : Controller
{
public HelloWorldController(ILogger<HelloWorldController> logger)
{
// ...
}
}

最佳答案

尽管 Alsami 的答案可行,但请改用以下注册:

container.RegisterConditional(
typeof(ILogger),
c => typeof(Logger<>).MakeGenericType(c.Consumer.ImplementationType),
Lifestyle.Singleton,
c => true);

// This next call is not required if you are already calling AutoCrossWireAspNetComponents
container.CrossWire<ILoggerFactory>(app);

此确切示例显示在 documentation 中.

此注册允许注入(inject) Logger<T>进入非通用 ILogger构造函数参数,其中 TLogger<T>成为记录器注入(inject)的类型。换句话说,当HelloWorldController取决于 ILogger , 它会被注入(inject) Logger<HelloWorldController> .这意味着您可以简化您的 HelloWorldController到以下内容:

public class HelloWorldController : Controller
{
public HelloWorldController(ILogger logger)
{
// ...
}
}

让您的应用程序组件依赖于 ILogger而不是 ILogger<T>你:

  • 简化您的应用程序代码
  • 简化单元测试
  • 消除发生意外错误的可能性,因为不可能注入(inject)错误的记录器。

关于c# - 无法解析 ILogger<T> 简单注入(inject)器 ASP.NET Core 2.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49300594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com