无法解析ILogger< T>简单注入器ASP.NET Core 2.0 [英] Cannot resolve ILogger<T> Simple Injector ASP.NET Core 2.0

查看:208
本文介绍了无法解析ILogger< T>简单注入器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&lt; T&gt;简单注入器ASP.NET Core 2.0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆