2011-08-19 30 views
5

如果您考慮在類中使用Properties.Settings.Default作爲依賴項,並因此注入它?對Properties.Settings.Default使用依賴注入?

例如爲:

public class Foo 
{ 
    private _settings; 
    private bool _myBool; 

    public Foo(Settings settings) 
    { 
     this._settings = settings; 
     this._myBool = this._settings.MyBool; 
    } 
} 


或者您會考慮使用Settings作爲一種廣泛的全球應用程序嗎?

例如爲:

public class Foo 
{ 
    private bool _myBool; 

    public Foo() 
    { 
     this._myBool = Properties.Settings.Default.MyBool; 
    } 
} 

回答

2

你可能想要在一個類中封裝設置併爲它們設置一個接口。這樣,你的設置來自哪裏可以改變,比如單元測試。如果您還在使用IoC容器,那麼通過所有方法註冊容器的設置。

我這樣做的ConfigurationManagerWebConfigurationManager,這樣我可以注入測試設置。 Nathan Gloyn has wrapped the adapters and interface up already in a project,你可以使用,如果你也想這樣做。

+0

我喜歡接口的想法,但我不知道如何去實現它。你的意思是有一個接口的屬性可以直接映射到Settings中的屬性,或者使用ConfigurationManager,就像你鏈接的代碼一樣?之前沒有使用ConfigurationManager,所以不太確定在這裏做什麼。另一個微調正確的方向將不勝感激。 :) – Andy

+0

'IConfigurationManager'只是外部設置可能在應用程序中的一個示例,您希望它們由容器處理並注入類中。對於你的'設置'類,我傾向於創建一個與'Settings'的公共成員最匹配的'ISettings'接口;所以如果你在'Settings'上有'ConnectionString'屬性,那麼就把它作爲接口上的一個屬性,等等。 –

+0

感謝你澄清,這是有道理的。 – Andy

2

他們應該被傳遞作爲一個依賴。想象一下當你想在你的例子#2中通過單元測試改變這組設置的場景 - 你必須在靜態屬性getter中有一些複雜的開關邏輯來適應這種情況。

許多IoC容器甚至可以在注入這樣的類時提供單例實現以幫助您。

4

我會選擇「以上都不是」,並直接注入布爾值:從支持布爾值的檢索任何基礎設施方面的知識

public class Foo 
{ 
    private readonly bool _myBool; 

    public Foo(bool myBool) 
    { 
     _myBool = myBool; 
    } 
} 

這樣可以使FooFoo沒有理由根據設置對象引入複雜性,特別是如果它包含其他不相關的值。

+0

+1,但請注意,使用DI容器進行配置會非常困難。儘管如此,仍然可能是最好的想法。 – Domenic

+0

@Domenic:絕對值得注意的是,一些DI容器可能無法像其他容器一樣輕鬆實現。我使用Autofac,它支持lambda表達式進行註冊,因此可以輕鬆注入原始值。 –

+0

@Bryan:我同意,但我上面的代碼片段被作爲一個過於簡單的例子來解決這個問題。然而,你說的是對的,所以謝謝你的回答。 – Andy