2015-05-12 20 views
20

Ho un'app ASP.NET MVC 6 (beta-4).Come registrare ILogger per l'iniezione 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); 

    // ... 
} 

E ho un regolatore di ...

public class HomeController : 
    Controller 
{ 
    ILogger _logger; 

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

    // ... 
} 

Ma quando non sto ottenendo il servizio registrato correttamente in qualche modo: InvalidOperationException: Unable to resolve service for type 'Microsoft.Framework.Logging.ILogger' while attempting to activate 'HomeController'.. Cosa sto sbagliando con la registrazione del logger?

+0

Non hai registrato "ILogger". – Steven

+0

Non si trattava di 'service.AddLogging()'? Potrei aver fatto una grande ipotesi con questo, il tempo di fare immersioni di fonte. – Travis

+0

Quindi, 'AddLogging()' dovrebbe registrare 'ILogger <>'. Forse ho bisogno di iniettare "ILogger " invece di "ILogger". – Travis

risposta

50

Ho pensato che services.AddLogging(); stia facendo la cosa giusta e registrando ILogger. Dopo aver guardato la fonte (https://github.com/aspnet/Logging/blob/d874c5726e713d3eb34938f85faf7be61aae0f2a/src/Microsoft.Framework.Logging/LoggingServiceCollectionExtensions.cs) ho scoperto che sta effettivamente registrando ILogger<>. La modifica della firma di ILogger a ILogger<HomeController> rende l'esempio precedente funzionante.

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

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

    // ... 
} 

Grazie a @Steve per avermi impostato sulla traccia giusta per trovare questo.

+0

Questo funziona. Ho letto che cambieranno RC2 per avere restituire qualsiasi T (come ) in modo da poter effettivamente ottenere l'implementazione e non solo i metodi di interfaccia. Al momento, puoi mettere qualcosa lì dentro e funziona, sembra che lo ignori. Ho testato ILogger solo per testare questa teoria e ha funzionato. –

+1

Ciò che viene effettivamente utilizzato per T è il contesto di registrazione. - chiami ILogger dove T di solito è il tipo di chiamata., ma potrebbe davvero qualsiasi cosa. – VisualBean

+0

È inoltre possibile specificare ILoggerFactory come descritto qui https://docs.asp.net/en/latest/fundamentals/logging.html – stankovski

0

Il services.AddLogging(); non ha funzionato per me, così ho aggiunto queste due affermazioni a ConfigureServices:

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

Ora il contenitore DI è felice e tutto funziona.

Problemi correlati