2017-08-25 153 views
1

我正在使用優秀的LibLog代碼在我的應用程序中抽象記錄器實現。簡單注射器註冊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" /> 
+0

我的王國「使用」命名空間。 (如果你有機會列出它們,那會很好,還有「packages.config」來顯示你在提問時使用的版本。 – granadaCoder

+0

你好,我不確定我有你的問題。表示ILog接口的名稱空間以及LogProvider類,那麼請查看問題中的第一個鏈接,即LibLog nuget。LibLog是一個nuget,它爲您提供了源代碼,因此命名空間是您的項目,我已經添加了SimpleInjector版本,如果我錯了,你可以讓我更好理解嗎? – Lorenzo

+0

是的,我現在看到它。這是我第一次看到一個nuget包引入源代碼.... ..而不是一個預編譯的組合,有點奇怪,但我現在「看」它。 – granadaCoder

回答

1

註冊LogLib是idential如何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>代理變得微不足道。