如果类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;
}
}
日志记录将以下服务添加到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");
}
你的第一个场景是有效的 ILogger<> 继承自 ILogger(看源代码)
public interface ILogger<out TCategoryName> : ILogger
{
}
但正如@KiranChalla所说,在 LoggingServiceCollectionExtensions ILogger<> 是注册的(不是 ILogger所以你的第二个场景不起作用。