我正在使用优秀的LibLog代码在我的应用程序中抽象记录器实现。
我也使用Simple Injector作为我的DI容器。
我想在我的类中注入一个logger实例,它对应于以下静态创建
private readonly ILog logger = LogProvider.For<MyClass>()
或者如果您喜欢静态方法
private readonly ILog logger = LogProvider.GetCurrentClassLogger()
这样做是否正确?
container.Register<ILog>(() => LogProvider.GetCurrentClassLogger(), Lifestyle.Singleton);
还是有更好的方法?
编辑:
<package id="SimpleInjector" version="4.0.8" targetFramework="net461" />
<package id="SimpleInjector.Packaging" version="4.0.8" targetFramework="net461" />
答案 0 :(得分:1)
注册LogLib对于使用Simple Injector的register log4net和register nlog的方法是必不可少的,文档也解释了这一点here。
您需要为ILog
进行有条件的注册,如下所示:
container.RegisterConditional(typeof(ILog),
context => typeof(LibLogLog<>).MakeGenericType(context.Consumer.ImplementationType),
Lifestyle.Singleton,
context => true);
LibLogLog<T>
是一个通用类,可将调用转发给LogProvider.For<T>()
:
public sealed class LibLogLog<T> : ILog
{
private static readonly ILog logger = LogProvider.For<T>();
public bool Log(LogLevel l, Func<string> f, Exception e, params object[] p) =>
logger.Log(l, f, e, p);
}
LibLog实际上是为数不多的正确设计日志接口的日志库之一(即只有一个成员)。这使得实现此LibLogLog<T>
代理变得微不足道。