[英]How to register ILogger for injection in 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'.
. 我在注册记录器时做错了什么?
我假设services.AddLogging();
正在做正确的事情并注册ILogger
。 查看源代码( https://github.com/aspnet/Logging/blob/d874c5726e713d3eb34938f85faf7be61aae0f2a/src/Microsoft.Framework.Logging/LoggingServiceCollectionExtensions.cs )后,我发现它实际上是在注册ILogger<>
。 将 ILogger 的签名更改为ILogger
ILogger<HomeController>
使上面的示例工作。
public class HomeController :
Controller
{
ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
// ...
}
感谢@Steve 让我在正确的轨道上找到了这个。
services.AddLogging();
对我不起作用,所以我将这两个语句添加到ConfigureServices
:
services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
现在 DI 容器很开心,一切正常。
只需将此行添加到ConfigureServices
services.AddSingleton(Serilog.Log.Logger);
.NET 5.0 解决方案; 它也适用于普通控制器和通用控制器:
public class EnhancedGeneric<T> : BaseApiController
{
private readonly ILogger _logger;
public EnhancedGeneric(ILoggerFactory logger)
{
_logger = logger.CreateLogger(typeof(T).Name);
}
public void OnGet()
{
_logger.LogInformation("GET pages called.");
}
}
您可以将以下行添加到您的ConfigureServices()
方法中:
services.AddTransient<ILogger>(s => s.GetService<ILogger<Program>>());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.