在没有具体 <T> 的情况下在 .Net 核心中感染 NLOG?

Inecting NLOG in .Net core without a concrete <T>?

docs 说我们应该使用它以便在 .Net 核心 DI 中使用 Nlog:

.UseNLog();  // NLog: setup NLog for Dependency injection

然后我们就可以使用DI了:

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

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

但我们不会将 ILogger 注入到每个 class 我们想要在其中记录的日志。

我们有一个名为 IHelper 的服务,它会依次注入 Ilogger :

public class Helpers : IHelpers
{
    private readonly ILogger _logger;

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

所以原来我们总是用Helpers作为类型。 ( :/)

我尝试仅注入 (!) ILogger(没有类型),但出现错误。

问题:

在没有虚拟 <Helpers>(在我的例子中...)类型的情况下使用 ILogger 是否有更好的模式?或者有没有办法不指定任何类型?

您可以使 IHelpersHelpers 通用。这将允许您使用 ILoggerFactory 创建 ILogger 的实例,该实例使用作为类型参数名称的类别。这是一个例子:

public interface IHelpers<T> { }

public class Helpers<T> : IHelpers<T>
{
    private readonly ILogger _logger;

    public Helpers(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger<T>();
    }
}

例如在SomeClass,在构造函数中对DI使用IHelpers<SomeClass>

public class SomeClass
{
    private readonly IHelpers<SomeClass> _helpers;

    public SomeClass(IHelpers<SomeClass> helpers)
    {
        _helpers = helpers;
    }
}

最后,将 IHelpers<T> 注册为开放通用,如下所示:

services.Add(ServiceDescriptor.Singleton(typeof(IHelpers<>), typeof(Helpers<>)));