【发布时间】:2017-08-16 05:10:40
【问题描述】:
在注入记录器时,我正在努力解决生活方式问题。
NLog 期望以“每个依赖的实例”创建实例,如此处所述 - https://simpleinjector.readthedocs.io/en/latest/lifetimes.html#instance-per-dependency。
使用工厂方法LogManager.GetCurrentClassLogger() 创建记录器。使用此模式允许记录器获取调用者的名称,以便将其包含在记录的消息中。
Simple Injector 告诉我,我的瞬态记录器无法注入到单例中。但是我无法将生活方式更改为 Singleton,因为这样我会丢失有关哪个类正在调用记录器的上下文信息。
我的实现如下:
我编写了一个工厂,它创建 NLog 实例并将其返回到实现我自己的 ILogger 抽象的包装器中:
internal class LoggerFactory : ILoggerFactory
{
public ILogger GetLogger()
{
return new NLogLogger(LogManager.GetCurrentClassLogger());
}
}
因此,我使用 Simple Injector 注册了它:
container.RegisterSingleton<ILoggerFactory, LoggerFactoryInstance>();
container.Register<ILogger>(
() => container.GetInstance<ILoggerFactory>().GetLogger());
而且我依赖于需要记录的类中的 ILogger 接口:
public class MyClass
{
private readonly ILogger _logger;
public MyClass(ILogger logger)
{
_logger = logger;
}
}
我必须注入工厂吗?我宁愿不必在任何我想使用它的地方解析记录器,但也许这就是 Simple Injector 所期望的?
其他人是如何处理这个问题的?有没有更好的办法?
【问题讨论】:
-
'NLog 期望实例被创建为“每个依赖的实例”'。你在哪里读到的?据我所知,您的记录器可以是单身人士。
-
我的陈述可能有点生硬——我相信它可以用任何一种方式。但我想使用“LogManager.GetCurrentClassLogger()”,它会自动获取调用类和方法的名称。如果记录器是单例,则无法使用此功能。 (这可能是一个有效的妥协,取决于你的需要......)
-
Logger<T>解决了这个问题。
标签: logging dependency-injection nlog simple-injector