2010-01-12 88 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刷新它们。
这涉及更多,并且根据需求,您可能需要担心保持设置对象的状态一致。