2010-01-12 134 views
1

我正在看一些使用.NET System.Configuration.SettingsProvider和ApplicationSettingsBase來處理配置的代碼。.NET SettingsProvider/ApplicationSettingsBase緩存

我們有一個派生自SettingsProvider的類,它使用數據庫作爲數據存儲,然後我們有其他設置類從ApplicationSettingsBase繼承,並具有[SettingsProvider(typeof(MySettingsProvider))]]屬性。

問題是我們在多個應用程序中使用這些設置類,但他們似乎永久緩存配置值,第一次加載它們。問題是,如果在一個應用程序中更改了設置,則其他應用程序在下次重新啓動之前將不會獲得設置,因爲它們在任何地方都被緩存。

我的問題是:有沒有辦法強制SettingsProvider實現,或從ApplicationSettingsBase派生的類不緩存值,每次訪問設置時重新查詢數據存儲?有效的答案可能是這些類不打算用於多應用程序環境中......

+0

即使您創建了ApplicationSettingsBase類的新實例,是否會發生這種情況? – 2010-05-14 23:02:56

回答

3

基於ApplicationSettingsBase的設置對象僅在實例化,保存或重新加載操作時與持久性機制/ SettingsProvider進行交互。剩下的時間,它只是在設置對象中處理哈希表。

有幾種方法可以獲得所需的行爲。

首先,您可以手動實現這些非緩存屬性,而不是依賴持久性機制。您可以在與正常vs.net生成的設置類配套的部分類中執行此操作。如果你實現了你自己的設置類,你不需要部分類,你可以直接添加屬性。這種方法的缺點是每次讀取該設置都會導致數據庫命中。

或者,如果您需要讀取緩存,但允許跨應用程序進行更改。在您可以覆蓋的ApplicationSetttingsBase.Save中,可以使用發佈/訂閱者機制,允許您通知所有訂閱者通過ApplicationSetttingsBase.Reload刷新它們。
這涉及更多,並且根據需求,您可能需要擔心保持設置對象的狀態一致。