在哪裡儲存應用程序設置?
最近,我發現“Web.Config”文件包含一個
<appSettings>似乎很適合儲存應用程序設置的部分。哎呀,它甚至具有通過標準系統庫訪問文件的程式方式。所以很聰明,我寫了一個介面來訪問它,然後是介面的具體實現,如下所示:public interface IAppSettings { IEnumerable<string> GetValues(string componentName, string settingName); IEnumerable<KeyValuePair<string, string>> GetValuePairs(string componentName, string settingName); void SetValues(string componentName, string settingName, IEnumerable<string> valueList, bool append); void SetValuePairs(string componentName, string settingName, IEnumerable<KeyValuePair<string, string>> pairList, bool append); }然後我發現在應用程序執行時將設置保存回“web.config”會導致整個應用程序重新啟動。這對我來說似乎完全不合理,因為如果我經常寫回 web.config 並且應用程序每次都重新啟動,那麼 HttpRuntime.Cache 之類的東西就會被完全清空,從而使我的 Cache 無用,因為它一直在清空和重新填充。
所以我想知道:我應該在哪裡儲存我的應用程序設置?
有沒有一個好的解決方案,這樣我就不必自己動手了?
編輯:
好的,感謝所有建議使用數據庫和潛在表模式的人。我想我將使用以下架構:
settings: index NUMBER NOT NULL AUTO_INCREMENT <== Primary Key component NVARCHAR(255) NOT NULL setting NVARCHAR(255) NOT NULL key NVARCHAR(255) value NVARCHAR(255) NOT NULL雖然我不認為我會“設置” P-Key,但使用 Auto-Incr Index 代替。這樣,如果我有一個應用程序需要將一些東西郵寄給多個經理,我可以儲存很多:
index component setting value 1 RequestModule ManagerEmail manager1@someplace 2 RequestModule ManagerEmail manager2@someplace然後我可以使用:
IEnumerable<string> GetValues(string componentName, string settingName);它將返回一個電子郵件地址列表,而不僅僅是一個值。
這有意義嗎?
web.config 通常用於只讀設置,即。系統管理員在部署應用程序期間設置的設置。
如果要讀寫設置*,*最明顯的方法是使用數據庫。順便說一句,這有一個優勢:一個應用程序可以託管在多個伺服器上,並且仍然可以正確讀取和寫入設置,
您還可以為設置實現自定義儲存,但實現起來可能會更困難,而且速度不會快很多。
要回答您的第二個問題,數據庫的結構取決於您要儲存的設置類型。
如果您需要像這樣儲存異構的唯一條目:
- 管理員的郵件地址,
- 在網站首頁上顯示的最大條目數,
- 在“關於我們”頁面上顯示的文字,
- 指示是否啟用公共評論的布爾值,
那麼您必須使用
varchars 或其他或多或少友好的類型作為鍵來辨識條目(而不是通過它們的索引來引用它們)。另一方面,如果您的目的是儲存多個管理員的郵件地址,您應該創建一個
Manager包含他們的郵件地址、姓名、他們上次連接的日期時間等的表。你真的不應該混合兩者。理論上,您可以通過組件/設置對來參考設置中的條目。在實踐中,它使事情變得更加困難並產生了一堆問題:
- 此外,如果您需要為每位經理儲存一個布爾值,指示她/他是否希望接收來自您的警報,該怎麼辦?以您目前的結構,這是不可能的。
- 由於相同的設置可以有多個值,您打算如何處理必須唯一的設置?例如,“關於我們”頁面上只能顯示一個文本值。如果數據庫中儲存了兩個值怎麼辦?