为什么ASP.NET Core DI知道如何解决ILogger <t>,而不是ILogger?

时间:2016-07-07 20:52:15

标签: logging asp.net-core

如果T类包含对ILogger的依赖,则解析依赖:

public class Foo
{
    private ILogger _logger;

    public Foo(ILogger<Foo> logger)
    {
        _logger = logger;
    }
}

但以下内容不起作用,因为logger将为null:

public class Foo
{
    private ILogger _logger;

    public Foo(ILogger logger)
    {
        _logger = logger;
    }
}

2 个答案:

答案 0 :(得分:15)

日志记录将以下服务添加到DI

services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());
services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(Logger<>)));

Logger<>取决于来自DI的ILoggerFactory

对于第二种情况,您需要注入ILoggerFactory而不是ILogger。

public Foo(ILoggerFactory loggerFactory)
{
    _logger = loggerFactory.CreateLogger("logger name here");
}

答案 1 :(得分:1)

您的第一个scenerio有效,因为ILogger<>继承自ILoggersee source code

public interface ILogger<out TCategoryName> : ILogger
{

}

但正如@KiranChalla所说,LoggingServiceCollectionExtensions ILogger<>已注册(而非ILogger),因此您的第二个场景无效。