如果类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
所以你的第二个场景不起作用。