如果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;
}
}
答案 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<>
继承自ILogger
(see source code)
public interface ILogger<out TCategoryName> : ILogger
{
}
但正如@KiranChalla所说,LoggingServiceCollectionExtensions
ILogger<>
已注册(而非ILogger
),因此您的第二个场景无效。