如何在静态 class 中使用 NLog,其中所有其他内容都与 Autofac 连接

How to use NLog in static class where everything else is wired with Autofac

我的 MVC 应用程序与 Autofac 连接。我还配置了 NLog,它在我的控制器 类 中按预期工作。我的 nLogger 注册如下:

var builder = new ContainerBuilder();
builder.RegisterGeneric(typeof(LoggerService<>))
  .As(typeof(ILoggerService<>)).SingleInstance();
var container = builder.Build();

而 ILoggerService 的构造函数是:

public LoggerService()
{
    SourceClass = typeof (T).FullName;
    Logger = LogManager.GetLogger(SourceClass);
 }

现在我也有很多我使用的静态助手类。例如:

public static class Helper
{
   public static string GenerateQrBitmap(string secret, string issuer, string userEmail)
   {
     ...
   }
}

但我也希望能够在这些 Helper 类 中使用记录器。

这是 static 类 不好的原因之一。

您有两个选择:

  1. 让它们不 static(并用 Autofac 注册它们)并采取 ILoggerService 作为构造函数参数。
  2. 改变他们的方法 (例如GenerateQrBitmap)将ILoggerService作为参数。

我建议前者。

另一种方法是使用 服务定位器 模式 - 并让 Helper 直接针对容器进行解析。我不会向您展示如何执行此操作,因为我不推荐这样做。它使代码更难进行单元测试,并且隐藏了您的依赖项。但是如果你 Google Autofac Service Locator static class c# 我相信你会解决的。