Reputation: 49779
If class T contains dependency on ILogger, dependency is resolved:
public class Foo
{
private ILogger _logger;
public Foo(ILogger<Foo> logger)
{
_logger = logger;
}
}
but the following does not work, as logger
will be null:
public class Foo
{
private ILogger _logger;
public Foo(ILogger logger)
{
_logger = logger;
}
}
Upvotes: 30
Views: 11072
Reputation: 24073
Your first scenerio works because ILogger<>
inherits from ILogger
(see source code)
public interface ILogger<out TCategoryName> : ILogger
{
}
But as @KiranChalla said, in the LoggingServiceCollectionExtensions
ILogger<>
is registered(not ILogger
) so your second scenerio does not work.
Upvotes: 2
Reputation: 57949
Logging adds the following services to DI
services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());
services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(Logger<>)));
and Logger<>
depends on ILoggerFactory
from DI.
For your second scenario you would need to inject ILoggerFactory instead of ILogger.
public Foo(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger("logger name here");
}
Upvotes: 22