简单的注入器寄存器LibLog

时间:2017-08-25 23:30:09

标签: c# dependency-injection simple-injector liblog

我正在使用优秀的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" />

1 个答案:

答案 0 :(得分:1)

注册LogLib对于使用Simple Injector的register log4netregister 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>代理变得微不足道。