在没有具体 <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
是否有更好的模式?或者有没有办法不指定任何类型?
您可以使 IHelpers
和 Helpers
通用。这将允许您使用 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<>)));
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
是否有更好的模式?或者有没有办法不指定任何类型?
您可以使 IHelpers
和 Helpers
通用。这将允许您使用 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<>)));