2011-02-11 111 views
1

將配置信息注入到新構建的實例中的以下方法的優缺點是什麼?你會用哪個?依賴注入設計問題

interface IApplicationConfiguration { 
    string SourcePath { get; } 
    string DestinationPath { get; } 
} 

選項之一:

class DailyFilePathProvider { 
    private readonly string sourcePath; 
    private readonly string destinationPath; 
    public DailyFilePathProvider(string sourcePath, string destinationPath) { 
     this.sourcePath = sourcePath; 
     this.destinationPath = destinationPath; 
    } 
} 

var configuration = container.Resolve<IApplicationConfiguration>(); 
var provider = new DailyFilePathProvider(configuration.SourcePath, configuration.DestinationPath); 

選項二:

class DailyFilePathProvider { 
    private readonly string sourcePath; 
    private readonly string destinationPath; 
    public DailyFilePathProvider(IApplicationConfiguration configuration) { 
     this.sourcePath = configuration.SourcePath; 
     this.destinationPath = configuration.DestinationPath; 
    } 
} 

var configuration = container.Resolve<IApplicationConfiguration>(); 
var provider = new DailyFilePathProvider(configuration); 

感謝所有的想法。

+0

我更願意將ApplicationConfiguration *留在IoC之外 – 2011-02-11 14:48:11

+0

你是什麼意思? – JackBlackAndWhite 2011-02-11 14:49:27

回答

0

我更喜歡選項2,所以我可以在不更改ctor的情況下輕鬆添加更多設置。我也將它切換到...

class DailyFilePathProvider { 
    private readonly IApplicationConfiguration configuration; 
0

第一個代碼只使用某種依賴注入的解決要使用的配置,但構建DailyFilePathProvider當它不使用依賴注入。

所以我會選擇第二個選項,你實際上正在將配置注入DailyFilePathProvider

這裏有一些更多關於NInject模式爲例:Injection patterns

1

這取決於

我會去選擇兩個if IApplicationConfiguration只包含與DailyFilePathProvider配置。如果它包含應用程序其他部分的配置,則可能會認爲這是「錯誤的分離問題」。在這種情況下,更好的選擇是將一個屬性IDailyFilePathProviderCfg添加到IApplicationConfiguration,其中包含專門用於DailyFilePathProvider的配置。通過這種方式,您可以獲得兩全其美的效果,您只需注入像選項一中的相關數據,但代碼也很容易維護,就像在選項二中一樣。

就我個人而言,我認爲應用程序範圍的配置最好在靜態類中抽象出來,因此代碼的所有部分都可以輕鬆訪問設置。

這個問題的答案很大程度上取決於我的個人編程風格。它還取決於您正在構建的應用程序的類型和大小。就我個人而言,我不喜歡在構造函數中注入比構建對象更多的內容。

1

我這個回答類似的問題可以提供一些見解:

Dependency Injection and AppSettings

的要點是,Confguration接口水暖這在消耗它的類沒有增加語義值。還有一個如何構建應用程序的例子,以便可以輕鬆傳播這些值。答案被標記爲問題被接受的答案。