Как зарегистрировать 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'.
. Что я делаю неправильно с регистрацией регистратора?
Ответы
Ответ 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 счастлив и все работает.