2015-06-10 90 views
0

我試着寫代碼,更好,我可以,因此在看一些代碼,我在過去寫的我見過,我訪問的.config的東西appsetting爲最佳實踐值

Public void Do() 
{ 
Var x = ConfigurationManager.AppSettings.Get("foo"); 
doSomethingElse(x); 
} 

在這個方法上編寫測試我問自己是不是有更好的接口來暴露所有.config AppSettings值的屬性?這將允許我通過IoC取代真正的實施。

另一方面我問是否將所有這些值包含在類/接口中是正確的?如果我有不同的程序集組成應用程序,我需要訪問該對象?假定這將是一個共享的項目是否有意義有一個值

Int ModelAvalue {get{};} 

在一個不會在ModelB使用該類定義?

回答

2

配置是一個依賴項。我認爲你關於創建一個返回最適合類型的接口的想法既有助於測試,又使代碼更易於理解。它還使您可以靈活地改變未來配置的存儲位置。

要回答您的其他問題,根據interface segregation principle,最好使接口更小,更具體。您可以有不同的界面,其中每個界面都是一組緊密相關的設置。例如,你不會有一個有你的數據庫連接字符串和你的日誌文件路徑的接口。

public interface IDatabaseConfiguration 
{ 
    string ConnectionString { get; } 
} 

public interface IBlogConfiguration 
{ 
    int NumberOfPostsPerPage { get; } 
} 

public class AppConfiguration : IDatabaseConfiguration, IBlogConfiguration 
{ 
    public string ConnectionString 
    { 
     get { return ConfigurationManager.ConnectionStrings["MyDb"].ConnectionString; } 
    } 

    public int NumberOfPostsPerPage 
    { 
     get { return int.Parse(ConfigurationManager.AppSettings["PostsPerPage"]); } 
    } 
} 

在未來,如果你決定NumberOfPostsPerPage應該存儲在別處,你可以創建一個不同的具體實施IBlogConfiguration

+0

感謝您的答覆,我同意你的100%,這樣的情況下我需要有服務器地址,主機和TCP緩衝區大小,我把它們放在一個界面中,用於記錄我把它放在別的地方。如果我有共同的價值觀,例如MaxRetryCount?我是否必須在接口中定義這些通用接口並使其他接口繼承它? – advapi

+0

它取決於'MaxRetryCount'的上下文,對於全局配置你可以有一個單獨的接口,但是如果MaxRetryCount指的是數據庫和Web服務,則可能意味着不同的事情。 – Matthew

+0

對不起,它與服務器重新連接值有關(在TCP服務器連接斷開的情況下),btw我已經理解了你的想法......我會採用 – advapi