【问题标题】:Simple Injector register LibLog简单的注射器寄存器 LibLog
【发布时间】:2018-01-11 05:30:35
【问题描述】:

我正在使用出色的 LibLog 代码在我的应用程序中抽象记录器实现。

我也使用Simple Injector 作为我的 DI 容器。

我想在我的类中注入一个对应于以下静态创建的记录器实例

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" />

【问题讨论】:

  • 我的王国“使用”命名空间。 (如果你有机会列出它们,那就太好了。还有“packages.config”来显示你在提问时使用的版本。
  • 你好,我不确定我有没有你的问题。如果您指的是 ILog 接口的命名空间以及 LogProvider 类,那么请查看问题中的第一个链接,即 LibLog nuget 的链接。 LibLog 是一个为您提供源代码的 nuget,因此命名空间属于您的项目,我添加了 SimpleInjector 版本。如果我错了,你能不能让我更好地理解?
  • 是的,我现在看到了。这是我第一次看到 nuget 包引入源代码......而不是预编译的程序集。有点奇怪,但我现在“看到”了。谢谢。

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


【解决方案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&lt;T&gt; 是一个通用类,将调用转发到LogProvider.For&lt;T&gt;()

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&lt;T&gt; 代理变得微不足道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2014-09-26
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多