如何在静态 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
类 不好的原因之一。
您有两个选择:
- 让它们不
static
(并用 Autofac 注册它们)并采取
ILoggerService
作为构造函数参数。
- 改变他们的方法
(例如
GenerateQrBitmap
)将ILoggerService
作为参数。
我建议前者。
另一种方法是使用 服务定位器 模式 - 并让 Helper
直接针对容器进行解析。我不会向您展示如何执行此操作,因为我不推荐这样做。它使代码更难进行单元测试,并且隐藏了您的依赖项。但是如果你 Google Autofac Service Locator static class c#
我相信你会解决的。
我的 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
类 不好的原因之一。
您有两个选择:
- 让它们不
static
(并用 Autofac 注册它们)并采取ILoggerService
作为构造函数参数。 - 改变他们的方法
(例如
GenerateQrBitmap
)将ILoggerService
作为参数。
我建议前者。
另一种方法是使用 服务定位器 模式 - 并让 Helper
直接针对容器进行解析。我不会向您展示如何执行此操作,因为我不推荐这样做。它使代码更难进行单元测试,并且隐藏了您的依赖项。但是如果你 Google Autofac Service Locator static class c#
我相信你会解决的。