如何在ASP.NET MVC 6中注册ILogger以进行注入

Tra*_*vis 40 logging dependency-injection asp.net-core-mvc

我有一个ASP.NET MVC 6(beta-4)应用程序.

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

我有一个控制器......

public class HomeController : 
    Controller
{
    ILogger _logger;

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

但是当我没有以某种方式正确地注册服务时:InvalidOperationException: Unable to resolve service for type 'Microsoft.Framework.Logging.ILogger' while attempting to activate 'HomeController'..注册记录器我做错了什么?

Tra*_*vis 85

我认为这services.AddLogging();是做正确的事并注册ILogger.在查看源代码(https://github.com/aspnet/Logging/blob/d874c5726e713d3eb34938f85faf7be61aae0f2a/src/Microsoft.Framework.Logging/LoggingServiceCollectionExtensions.cs)后,我发现它实际上正在注册ILogger<>.更改签名ILogger,以ILogger<HomeController>使上面的例子中工作.

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

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

感谢@Steve让我在正确的轨道上找到这个.


rub*_*ito 7

services.AddLogging();对我没有用,所以我将这两个陈述添加到ConfigureServices:

services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
Run Code Online (Sandbox Code Playgroud)

现在DI容器很开心,一切正常.