Подтвердить что ты не робот

Как зарегистрировать ILogger для инъекций в ASP.NET MVC 6

У меня есть приложение 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);

    // ...
}

И у меня есть контроллер...

public class HomeController : 
    Controller
{
    ILogger _logger;

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

    // ...
}

Но когда я не получаю сервис, зарегистрированный как-то так: InvalidOperationException: Unable to resolve service for type 'Microsoft.Framework.Logging.ILogger' while attempting to activate 'HomeController'.. Что я делаю неправильно с регистрацией регистратора?

4b9b3361

Ответ 1

Я предположил, что 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;
    }

    // ...
}

Благодаря @Steve для установки меня на правильном пути, чтобы найти это.

Ответ 2

services.AddLogging(); не работал у меня, поэтому я добавил эти два оператора в ConfigureServices:

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

Теперь контейнер DI счастлив и все работает.