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

Set*_*Set 20 logging asp.net-core

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

public class Foo
{
    private ILogger _logger;

    public Foo(ILogger<Foo> logger)
    {
        _logger = logger;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public class Foo
{
    private ILogger _logger;

    public Foo(ILogger logger)
    {
        _logger = logger;
    }
}
Run Code Online (Sandbox Code Playgroud)

Kir*_*lla 17

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

services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());
services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(Logger<>)));
Run Code Online (Sandbox Code Playgroud)

Logger<>取决于ILoggerFactoryDI.

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

public Foo(ILoggerFactory loggerFactory)
{
    _logger = loggerFactory.CreateLogger("logger name here");
}
Run Code Online (Sandbox Code Playgroud)