使用Microsoft.Extensions.Logging从静态成员进行日志记录

根据 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging,使用Microsoft.Extensions.Logging的建议方法似乎是通过依赖注入ILogger对象.

在依赖注入不起作用(或不能正常工作)的情况下建议的模式是什么,例如在扩展方法,类型初始值设定项,静态属性和其他静态成员中,传递ILogger会非常麻烦?

使用log4net(我的团队之前使用过),一个常见的模式是:

public static class SomeExtensions
{
  private static readonly ILog s_log = LogManager.GetLogger(typeof(SomeExtensions));

  public static void ExtensionMethod (this SomeType someType)
  {
    s_log.Info("...");
  }
}

Microsoft.Extensions.Logging是否有类似的既定或推荐模式?

DI对于静力学并不好玩.从某种意义上说,它们是一种对立的设计哲学. ASP.NET大量使用静态(HttpContext,任何人?),并且在很多方面使用依赖注入非常困难. ASP.NET Core选择避开静态并使用100%DI模型.

简而言之,如果你想使用依赖注入,你的静态使用应该消失.在大多数情况下,这实际上是一件非常好的事情.虽然它们可以用于某些事情,但在大多数情况下都会被滥用.你可以用静态做很多事情,你不能用单例范围内的依赖注入类来做,后者为你提供了更大的抽象和可重用性.

无法真正替换的静态的一种用法是扩展.当然,有一整套思想认为你不应该使用扩展,无论如何.但是,如果您需要或想要扩展,那么您要么无法从这些扩展,要么您必须将logger实例作为参数传递.在许多情况下,必须传入记录器会严重限制扩展的有用性,因此您可能会完全没有登录.然而,即使你是学校认为扩展是好的和花花公子,大多数人会同意他们也应该在范围有限:即他们应该做一些简单的事情,不需要很多代码.如果是这种情况,实际登录的需求会急剧减少.

简而言之,它简单归结为您必须做出的设计决策.如果你想要依赖注射路线,静力学将是你家的瘟疫,你应该避免它们.

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...