2017-08-02 44 views
3

我正在研究一個遺留代碼庫,嚴重需要重構SOLID原則。作爲第一步,我們將Simple Injector依賴注入容器添加到混合中。簡單的注射器有辦法註冊一個實例工廠和TypeFactoryContext的組合嗎?

因爲我需要的東西非常像log4net的的RegisterConditional例如註冊的一個,即:

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

不同的是,我要注入由工廠方法,它採用了c.Consumer返回一個實例.ImplementationType作爲輸入:

container.Register???(
    typeof(ILogger), 
    c => LoggerProvider.GetLogger(c.Consumer.ImplementationType), 
    Lifestyle.Transient); 

這可以在簡單的噴油器中完成嗎?

我已閱讀a similar question的答案,但這還不夠。 ImplementationType需要交給實例工廠。

暫時,我將實施記錄儀<TParent>和使用,在RegisterConditional電話:

public class Logger<TParent> : ILogger 
{ 
    private readonly ILogger _decoratedLogger; 

    public Logger() 
    { 
     _decoratedLogger = Logger.GetLogger(typeof(TParent)); 
    } 
} 
+1

「我們將第一步添加Simple Injector依賴注入容器。」您可能想稍後開始使用DI容器。請參閱:https://stackoverflow.com/a/32033648/264697 – Steven

+0

好點。我們確實考慮過爲Pure DI提供短暫的時間。但是,代碼庫用於多個應用程序。每個都需要一個會快速損害可維護性的組合根。 – AroglDarthu

回答

3

可這在簡單的噴油器來完成?

是和否。

  • 沒有,這是不使用RegisterConditional支持,這是因爲簡單的注射器試圖推動你走向註冊類型,因此它可以驗證和診斷你的對象圖儘可能地。首選的方法是創建一個代理類,如解釋here所述。它基本上解釋了你當前的解決方案,但是有Logger<T>,而不是從LogImp繼承,因爲這導致更簡單的解決方案。

  • ,這是可能的,但你必須能夠恢復到使用自定義IDependencyInjectionBehavior作爲解釋here(例子是Serilog,但可以很容易地改寫爲log4net的)。如果可能的話,第一種方法是優選的。

+0

「,但是具有從LogImp繼承而來的Logger 」。 完成完成;-) – AroglDarthu