2016-07-07 3 views
9

Wenn Klasse T Abhängigkeit von ILogger enthält, wird die Abhängigkeit gelöst:Warum kann ASP.NET Core DI ILogger <T>, aber nicht ILogger lösen?

public class Foo 
{ 
    private ILogger _logger; 

    public Foo(ILogger<Foo> logger) 
    { 
     _logger = logger; 
    } 
} 

aber die folgende nicht funktioniert, wie logger null sein wird:

public class Foo 
{ 
    private ILogger _logger; 

    public Foo(ILogger logger) 
    { 
     _logger = logger; 
    } 
} 

Antwort

8

Logging fügt die folgenden Dienstleistungen an DI

services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>()); 
services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(Logger<>))); 

und Logger<> ist abhängig von ILoggerFactory von DI.

Für Ihr zweites Szenario müssten Sie ILoggerFactory anstelle von ILogger injizieren.

public Foo(ILoggerFactory loggerFactory) 
{ 
    _logger = loggerFactory.CreateLogger("logger name here"); 
} 
0

Ihre erste scenerio funktioniert, weil ILogger<> erbt von ILogger (see source code)

public interface ILogger<out TCategoryName> : ILogger 
{ 

} 

Aber wie @KiranChalla sagte, in der LoggingServiceCollectionExtensionsILogger<> registriert ist (nicht ILogger) so Ihre zweite scenerio funktioniert nicht.

Verwandte Themen