3

我在我的項目中使用依賴注入有一個小問題。爲了描述問題,我將使用簡單的例子。假設我在寫記錄器應用程序,並且最終用戶可以選擇是將日誌保存到文件還是寫入控制檯。用戶通過選擇運行應用程序中的複選框來控制它。他可以選擇兩個或只有一個。選擇後,點擊「LOG」按鈕執行操作。 現在我從我的DI的知識瞭解我應該創建接口:依賴注入和接口的很多實現

public interface ILogger 
{ 
    void log(); 
} 

和兩個實現

public class ConsoleLogger : ILogger 
{ 
    public void log() 
    { 
     ... 
    } 
} 

public class FileLogger : ILogger 
{ 
    public void log() 
    { 
     ... 
    } 
} 

我知道我可以在例如統一容器都實現註冊,並讓他們在構造函數通過使用表,但是然後我不能識別哪個實施方式中是FileLogger並且其ConsoleLogger(在情況下,當用戶僅選擇一個複選框)

第二選項是解決IMPL使用服務定位器模式來自ioc的名字。我不知道這是否是一個好方法

在我的實際應用中,我將有更多的選擇超過兩個,有將每個選項是一個很大的共享接口。

也許最好是使用MEF?

應用程序將使用WPF + PRISM編寫。

回答

3

我通常這樣做的方式是讓您的課程依賴於ILoggerFactory,它可以創建名稱爲​​的實例。

工廠實現,LoggerFactory,就拿着容器的內核,並能夠通過名稱解析組件。

通知工廠接口如何只告訴你,它可以創建對象 - 它不會給你任何潛在的內核,或DI框架任何暗示 - 工廠實現是知道這些細節的人。

事情是這樣的:

public class MyLoggingClass 
{ 
    private readonly ILoggerFactory _loggerFactorty; 

    public MyLoggingClass(ILoggerFactory factory) 
    { 
     _loggerFactorty = factory; 

     var fileLogger = _loggerFactorty.Create("fileLogger"); 
     var consoleLogger = _loggerFactorty.Create("consoleLogger"); 
    } 
} 


public class LoggerFactory : ILoggerFactory 
{ 
    public ILogger Create(string key) 
    { 
     return kernel.Resolve<ILogger>(key); 
    } 
} 

框架,比如溫莎城堡甚至給你這些工廠免費:你甚至不用寫它的實現。

+0

我明白,我所有的工廠應該是我的根組成部分。謝謝! – niba

0

我沒有看到創建自定義工廠的點,如果你想要的是國際奧委會的基本功能。如果您打算使用WPF和Prism開發應用程序,一個好方法是使用一個支持的IOC容器。我用Unity很多,非常喜歡它。另一個受支持的版本是MEF(如你所建議的)。

它們都允許您使用名稱來解析接口。這是不錯的做法,並提供瞭解決正確界面的結構化方式。

對於使用棱鏡使用Unity或MEF,在這裏看到:

http://msdn.microsoft.com/en-us/library/gg430868(v=pandp.40).aspx