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


如果类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;
    }
}

6934
2017-07-07 20:52


起源



答案:


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

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

Logger<> 依赖于取决于 ILoggerFactory 来自DI。

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

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

10
2017-07-07 20:58





你的第一个场景是有效的 ILogger<> 继承自 ILogger看源代码

public interface ILogger<out TCategoryName> : ILogger
{

}

但正如@KiranChalla所说,在 LoggingServiceCollectionExtensions  ILogger<> 是注册的(不是 ILogger所以你的第二个场景不起作用。


1
2017-07-07 21:31