gpt4 book ai didi

logging - 如何使用 Simple Injector 配置 NLog 生活方式?

转载 作者:行者123 更新时间:2023-12-02 00:22:34 24 4
gpt4 key购买 nike

在注入(inject)记录器时,我正在努力解决生活方式问题。

NLog 期望以“每个依赖项的实例”创建实例,如此处所述 - https://simpleinjector.readthedocs.io/en/latest/lifetimes.html#instance-per-dependency .

记录器创建是使用工厂方法LogManager.GetCurrentClassLogger()完成的。使用此模式允许记录器获取调用者的名称,以便将其包含在记录的消息中。

简单注入(inject)器告诉我,我的 transient 记录器无法注入(inject)到单例中。但我无法将生活方式更改为 Singleton,因为这样我就会丢失有关哪个类正在调用记录器的上下文信息。

我的实现如下:

我编写了一个工厂,用于创建 NLog 实例并将其返回到实现我自己的 ILogger 抽象的包装器中:

internal class LoggerFactory : ILoggerFactory
{
public ILogger GetLogger()
{
return new NLogLogger(LogManager.GetCurrentClassLogger());
}
}

我用简单注入(inject)器注册了它:

container.RegisterSingleton<ILoggerFactory, LoggerFactoryInstance>();
container.Register<ILogger>(
() => container.GetInstance<ILoggerFactory>().GetLogger());

我依赖于需要日志记录的类中的 ILogger 接口(interface):

public class MyClass
{
private readonly ILogger _logger;
public MyClass(ILogger logger)
{
_logger = logger;
}
}

我必须注入(inject)工厂吗?我宁愿不必在我想使用它的任何地方解析记录器,但也许这就是简单注入(inject)器所期望的?

其他人如何处理这个问题?有更好的办法吗?

最佳答案

您应该使用基于上下文的注入(inject),如here所述。这意味着您创建了一个通用 Logger<T>实现 (理想情况下 your own defined ) ILogger并使用消费者的上下文注册它:

container.RegisterConditional(
typeof(ILogger),
c => typeof(Logger<>).MakeGenericType(c.Consumer.ImplementationType),
Lifestyle.Singleton,
c => true);

这样Logger<T>实现会将调用转发到 NLog,同时使用提供的 T :

public class Logger<T> : ILogger
{
private readonly NLogLogger logger = new NLogLogger(typeof(T));

public void Log(LogEntry entry)
{
logger.Log(...);
}
}

关于logging - 如何使用 Simple Injector 配置 NLog 生活方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42979575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com