2015-05-12 3 views
20

Ich habe eine ASP.NET MVC 6 (beta-4) App registrieren.Wie ILogger für die Injektion in ASP.NET MVC 6

public void ConfigureServices(IServiceCollection services) 
{ 
    // Logging 
    services.AddLogging(); 

    // ... 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory) 
{ 
    // Add the console logger. 
    loggerfactory.AddConsole(minLevel: LogLevel.Warning); 

    // ... 
} 

Und ich habe einen Controller ...

public class HomeController : 
    Controller 
{ 
    ILogger _logger; 

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

    // ... 
} 

Aber wenn ich den Dienst nicht richtig irgendwie eintragen: InvalidOperationException: Unable to resolve service for type 'Microsoft.Framework.Logging.ILogger' while attempting to activate 'HomeController'.. Was mache ich falsch mit der Registrierung des Loggers?

+0

Sie haben 'ILogger' nicht registriert. – Steven

+0

Ist das nicht 'service.AddLogging()'? Ich könnte damit eine große Annahme gemacht haben, Zeit zu gehen, um zu tauchen. – Travis

+0

Also, 'AddLogging()' sollte 'ILogger <>' registrieren. Vielleicht muss ich 'ILogger ' anstelle von 'ILogger' injizieren. – Travis

Antwort

50

ich davon aus, dass services.AddLogging(); war das Richtige zu tun und ILogger Registrierung. Nach dem Betrachten der Quelle (https://github.com/aspnet/Logging/blob/d874c5726e713d3eb34938f85faf7be61aae0f2a/src/Microsoft.Framework.Logging/LoggingServiceCollectionExtensions.cs) habe ich festgestellt, dass es tatsächlich ILogger<> registriert. Ändern der Signatur von ILogger zu ILogger<HomeController> macht das obige Beispiel funktioniert.

public class HomeController : 
    Controller 
{ 
    ILogger<HomeController> _logger; 

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

    // ... 
} 

Dank @Steve für mich auf dem richtigen Weg, um dies zu finden.

+0

Das funktioniert. Ich lese, dass sie RC2 ändern werden, um zurückzugeben, was auch immer T ist (wie ), so dass Sie tatsächlich Ihre Implementierung und nicht nur die Schnittstellenmethoden erhalten können. Momentan kann man alles hineinlegen und es funktioniert, sieht so aus als ob es es ignoriert. Ich habe ILogger getestet, um diese Theorie zu testen, und es hat funktioniert. –

+1

Was T tatsächlich verwendet wird, ist der Protokollierungskontext. - du rufst ILogger an, wobei T normalerweise der rufende Typ wäre., könnte aber alles wirklich. – VisualBean

+0

Sie können auch ILoggerFactory angeben, wie hier beschrieben https://docs.asp.net/en/latest/fundamentals/logging.html – stankovski

0

The services.AddLogging(); nicht für mich gearbeitet, so dass ich hinzugefügt, diese beiden Aussagen zu ConfigureServices:

services.AddSingleton<ILoggerFactory, LoggerFactory>(); 
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); 

Nun ist der DI-Container ist glücklich und alles funktioniert.

Verwandte Themen