我正在處理一個代碼庫,它有很多相同的ConfigurationManager.AppSetting調用分散在整個過程中。重複調用ConfigurationManager.AppSettings以獲取appsetting值的性能問題?
這聽起來像是一個可能的性能問題嗎?
或者因爲數據非常小很微不足道而且不「昂貴」?不斷返回文件以獲取數據,還是.NET運行時緩存文件/值/調用?
如果這不是一個性能問題,它是訪問應用程序配置值的一種混亂的方法,應該重新考慮更清晰和一致的實現訪問設置?
我正在處理一個代碼庫,它有很多相同的ConfigurationManager.AppSetting調用分散在整個過程中。重複調用ConfigurationManager.AppSettings以獲取appsetting值的性能問題?
這聽起來像是一個可能的性能問題嗎?
或者因爲數據非常小很微不足道而且不「昂貴」?不斷返回文件以獲取數據,還是.NET運行時緩存文件/值/調用?
如果這不是一個性能問題,它是訪問應用程序配置值的一種混亂的方法,應該重新考慮更清晰和一致的實現訪問設置?
我會說這是更多的代碼可維護性問題比性能問題。在AppSettings
上進行的簡單字典查找不會成爲問題,除非您的代碼嘗試在運行時間爲100次的循環中執行AppSettings
查找。這樣的代碼肯定會導致性能問題。但更重要的是,您將在整個代碼庫中擁有ConfigurationManager.AppSettings["MyKey"]
。你正在引入一個魔術字符串。如果您必須更改配置文件中的密鑰,則必須徹底搜索並替換所有項目中的密鑰。而且,我們通常會根據appSettings中存儲的值做出一些決定。它並不總是直接閱讀和使用的價值。有時候你會根據價值做出決定。例如,
if (ConfigurationManager.AppSettings["DebugMode"] == "yes")
do this
else
do that
你可能會在百個地方重複這個邏輯。現在讓我們假設你需要在那裏添加另一個條件:
if (ConfigurationManager.AppSettings["DebugMode"] == "yes" || ConfigurationManager.AppSettings["InternetNotAvailable"] == "yes")
do this
else
do that
這會變得混亂。你的代碼開始發臭。
因此,我始終建議我的開發團隊在代碼中的任何地方永遠不要使用ConfigurationManager.AppSettings
。在讀取配置值的地方使用一些靜態類,並將所有這些決策預存到一個變量中。例如,
static class ConfigHelper
{
private readonly static bool ExternalWebserviceCallAllowed = ConfiguationManager.AppSettings["DevMode"] == "false" && ConfigurationManager.AppSettings["InternetAvailable"] == "true";
}
.
.
if (ConfigHelper.ExternalWebserviceCallAllowed)
do this
else
do that
這不僅在性能上更好,而且還具有高度可維護和可擴展的代碼。
謝謝,我在其他代碼庫中也看到了這種模式。 –
這裏有幾件事。
偉大的觀點,特別是關於預優化:) –
就我個人而言,我使用ConfigurationManager,我沒有任何問題,我發現它非常簡單,可以在不必重新編譯問題的情況下更改設置。除非你可以獲得另一種形式的永久內存來保存你的設置,否則通過ConfigurationManager訪問文件對我來說似乎是最好的。 –