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

C# 如何在ASP.NET MVC 6中注册ILogger以进行注入,c#,logging,dependency-injection,asp.net-core-mvc,C#,Logging,Dependency Injection,Asp.net Core Mvc,我有一个ASP.NETMVC6(beta-4)应用程序 我有一个控制器 public class HomeController : Controller { ILogger _logger; public HomeController(ILogger logger) { _logger = logger; } // ... } 但当我无法正确注册服务时:InvalidOperationException:无法在尝试激活“H

我有一个ASP.NETMVC6(beta-4)应用程序

我有一个控制器

public class HomeController : 
    Controller
{
    ILogger _logger;

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

    // ...
}

但当我无法正确注册服务时:
InvalidOperationException:无法在尝试激活“HomeController”时解析类型为“Microsoft.Framework.Logging.ILogger”的服务。
。我注册日志记录程序有什么错

我假设
services.AddLogging()
做了正确的事情并注册了
ILogger
。查看源代码()后,我发现它实际上正在注册
ILogger
。将
ILogger
的签名更改为
ILogger
可以使上述示例正常工作

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

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

    // ...
}
公共类家庭控制器:
控制器
{
ILogger\u记录器;
公共家庭控制器(ILogger记录器)
{
_记录器=记录器;
}
// ...
}

感谢@Steve帮我找到了这个

services.AddLogging()对我不起作用,所以我将这两条语句添加到
ConfigureServices

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

现在DI容器很高兴,一切正常。

只需将这一行添加到
ConfigureServices

services.AddSingleton(Serilog.Log.Logger);

.NET5.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.");
    }
}
public类增强器eneric:BaseApiController
{
专用只读ILogger\u记录器;
公共增强型能量(iLogger)
{
_logger=logger.CreateLogger(typeof(T).Name);
}
公共互联网
{
_logger.LogInformation(“获取调用的页面”);
}
}

您没有注册
ILogger
。这不是
服务吗。AddLogging()
是吗?我可能已经做了一个伟大的假设,是时候进行源代码潜水了。所以,
AddLogging()
应该注册
ILogger
。也许我需要注入
ILogger
而不是
ILogger
。我自己刚刚查看了vNext源代码,我认为你是对的。但是,我仍然不想依赖于框架定义的抽象。有关更多信息,请参阅。哦,我想我已将代码链接粘贴到:。Microsoft提供了一个抽象,因此您可以使用任何只需一些配置的记录器。我同意这一点,而不是只坚持一个。虽然我从来没有费心改变一个记录器一旦在船上。这是工作。我读到他们将修改RC2,使其返回任何T(如),这样您就可以实际获得您的实现,而不仅仅是接口方法。目前,你可以把任何东西放在那里,它可以工作,看起来它忽略了它。我测试ILogger只是为了测试这个理论,它是有效的。T实际上是用来记录上下文的您可以调用ILogger,其中T通常是调用类型,但实际上可以是任何类型。您也可以按此处所述指定ILogger工厂。签名确实是问题所在。这对我来说很有效。伊洛格。非常感谢。这救了我几个小时的忙。
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.");
    }
}