繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM