Tengo un ASP.NET MVC 6 (beta 4) de la aplicación.

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);

    //...
}

Y tengo un controlador de…

public class HomeController : 
    Controller
{
    ILogger _logger;

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

    //...
}

Pero cuando no estoy recibiendo el servicio registrado correctamente alguna manera: InvalidOperationException: Unable to resolve service for type 'Microsoft.Framework.Logging.ILogger' while attempting to activate 'HomeController'.. ¿Qué estoy haciendo mal con el registro de la bitácora?

  • Usted no se ha registrado ILogger.
  • No es que se service.AddLogging() hace? Yo podría haber hecho una gran asunción con que, tiempo para ir a la fuente de buceo.
  • Así, AddLogging() debe registrar ILogger<>. Tal vez tengo que inyectar ILogger<T> en lugar de ILogger.
  • Sólo se veía en la vNext código fuente a mí mismo y creo que tienes razón. Pero aún así, yo no quiero depender de un marco definido de abstracción en todo. Para más información, consulte este.
  • Oh, pensé que me pega el código de enlace en: github.com/aspnet/Logging/blob/… . Microsoft proporciona una abstracción así que usted puede utilizar cualquier registrador con sólo algunos cambios en la configuración. Estoy de acuerdo con eso, en lugar de quedarse con una sola. A pesar de que nunca me he molestado en cambiar un registrador una vez que estaba a bordo.
  • Cambiar el subyacente marco de registros no es su única preocupación. Se trata de definir una abstracción específica a las necesidades de su aplicación, la prevención de su código de tener una innecesaria dependencia de código externo, y mantener el código comprobable como sea posible.
  • Es claro para mí cómo el uso de esta abstracción viole alguna de que. La abstracción es similar a otras abstracciones he trabajado en, por ejemplo, github.com/MassTransit/MassTransit/tree/develop/src/MassTransit/…
  • Si usted lee este, vas a entender que viola tanto la ISP y de la INMERSIÓN.
  • Otra cosa, ya que son la inyección de un registrador en su HomtController, asegúrese de que usted no es de registro mucho.

InformationsquelleAutor Travis | 2015-05-12

2 Comentarios

  1. 80

    Supuse que services.AddLogging(); estaba haciendo lo correcto y registrar ILogger. Después de mirar la fuente (https://github.com/aspnet/Logging/blob/d874c5726e713d3eb34938f85faf7be61aae0f2a/src/Microsoft.Framework.Logging/LoggingServiceCollectionExtensions.cs) he encontrado que es en realidad el registro de ILogger<>. El cambio de la firma de ILogger a ILogger<HomeController> hace que el ejemplo anterior trabajo.

    public class HomeController : 
        Controller
    {
        ILogger<HomeController> _logger;
    
        public HomeController(ILogger<HomeController> logger) 
        {
            _logger = logger;
        }
    
        //...
    }
    

    Gracias a @Steve para la configuración de mí en el camino correcto para encontrar esto.

    • Esto funciona. He leído que van a alterar RC2 tener <T> devolver lo T es (como <AppSpecificLogger>) así que usted puede conseguir realmente su aplicación y no sólo los métodos de interfaz. Actualmente, usted puede poner cualquier cosa en la que hay y funciona, parece que lo ignora. He probado ILogger<IMemoryCache> solo para probar que la teoría y funcionó.
    • Lo que T se utiliza realmente para, es el registro de contexto. – se llama ILogger <T> donde T suele ser el de llamada escriba. pero ¿hay algo de verdad.
    • También puede especificar ILoggerFactory como se describe aquí docs.asp.net/en/latest/fundamentals/logging.html
    • Realmente la firma era el problema. Este ha estado trabajando para mí. ILogger<HomeController>. Muchas gracias.
    • Esto sólo me salvó después de un par de horas de estar estupefacto.
  2. 7

    La services.AddLogging(); no funcionó para mí, así que he añadido estas dos declaraciones a ConfigureServices:

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

    Ahora el contenedor de DI es feliz y todo funciona.

Dejar respuesta

Please enter your comment!
Please enter your name here