无法解析ILogger< T>简单注入器ASP.NET Core 2.0 [英] Cannot resolve ILogger<T> Simple Injector ASP.NET Core 2.0
问题描述
我们在ASP.NET Core应用程序中使用简单注入器.最近,我们决定将Serilog用于记录目的.
We use Simple Injector in ASP.NET Core application. Recently we've decided to use Serilog for logging purposes.
配置已在Program.cs中完成,如其文档所述.然后,为了使Simple Injector能够解析ILoggerFactory
,我做了这样的事情:
Configuration was done in Program.cs as stated in their documentation. Then, in order to make Simple Injector able to resolve ILoggerFactory
I did something like this:
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
,都可以对其进行注入.并且工作正常(创建新实例ILogger<T>
).
After that ILoggerFactory
can be injected wherever we use it. And it works fine (creates new instances ILogger<T>
).
但这很烦人,每次需要时从工厂创建实例.
最好直接在相关类中获取ILogger<T>
而不是ILoggerFactory
.
But this is annoying, to create instance from factory every time we need.
It would be better to get ILogger<T>
directly in dependent class, instead of ILoggerFactory
.
那么,如何在以下情况下注册ILogger<T>
以获得实例?
So, how can I register ILogger<T>
to get instance in case like below?
public class HelloWorldController : Controller
{
public HelloWorldController(ILogger<HelloWorldController> logger)
{
// ...
}
}
推荐答案
尽管Alsami的答案可行,但请使用以下注册:
Although Alsami's answer would work, use the following registration instead:
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);
文档.
此注册允许将Logger<T>
注入到非泛型 ILogger
构造函数参数中,其中Logger<T>
的T
成为记录器被注入的类型.换句话说,当HelloWorldController
依赖于ILogger
时,它将注入一个Logger<HelloWorldController>
.这意味着您可以将HelloWorldController
简化为以下内容:
This registration allows injecting the Logger<T>
into a non-generic ILogger
constructor argument, where the T
of Logger<T>
becomes the type the logger is injected into. In other words, when HelloWorldController
depends on ILogger
, it will get injected with a Logger<HelloWorldController>
. This means you can simplify your HelloWorldController
to the following:
public class HelloWorldController : Controller
{
public HelloWorldController(ILogger logger)
{
// ...
}
}
通过让您的应用程序组件依赖于ILogger
而不是ILogger<T>
:
By letting your application components depend on ILogger
rather than ILogger<T>
you:
- 简化您的应用程序代码
- 简化单元测试
- 消除了由于可能注入错误的记录器而导致出现意外错误的可能性.
这篇关于无法解析ILogger< T>简单注入器ASP.NET Core 2.0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!