.NET SettingsProvider / ApplicationSettingsBase кеширование - PullRequest
1 голос
/ 12 января 2010

Я смотрю на некоторый код, который использует .NET System.Configuration.SettingsProvider и ApplicationSettingsBase для обработки конфигурации.

У нас есть класс, производный от SettingsProvider, который использует базу данных в качестве хранилища данных, а затем у нас есть другие классы настроек, которые наследуются от ApplicationSettingsBase и имеют атрибут [SettingsProvider (typeof (MySettingsProvider)))].

Проблема в том, что мы используем эти классы настроек в нескольких приложениях, но, похоже, они постоянно кэшируют значения конфигурации при первой загрузке. Проблема заключается в том, что если параметр изменяется в одном приложении, другие приложения не получат его до следующего перезапуска, поскольку они кэшируются повсеместно.

Мой вопрос: есть ли способ заставить реализацию SettingsProvider или классы, полученные из ApplicationSettingsBase, не кэшировать значения и повторно запрашивать хранилище данных каждый раз, когда к параметру обращаются? Правильный ответ может быть, что эти классы не предназначены для использования в средах с несколькими приложениями ...

1 Ответ

3 голосов
/ 06 июня 2010

Объекты настроек, основанные на ApplicationSettingsBase, взаимодействуют только с механизмом сохранения / SettingsProvider только при выполнении операций создания экземпляра, сохранения или перезагрузки. В остальное время это просто работа с хеш-таблицами в объекте настроек.

Есть несколько способов получить желаемое поведение.

Во-первых, вы можете реализовать эти некэшируемые свойства вручную, а не полагаться на механизм сохранения. Вы можете сделать это в частичном классе, который является дополнением к вашему классу сгенерированных настроек против vs.net. Если вы реализовали свой собственный класс настроек, вам не нужен частичный класс, и вы можете просто прикоснуться к свойству. Недостаток этого подхода заключается в том, что при каждом чтении этого параметра будет происходить удар по дБ.

В качестве альтернативы, если вам нужно кэширование чтения, все же допускайте изменения в приложениях. В ApplicationSetttingsBase.Save, который вы можете переопределить, вы можете использовать механизм публикации / подписчика, который позволяет уведомлять всех подписчиков, чтобы они обновляли их через ApplicationSetttingsBase.Reload.
Это гораздо сложнее, и в зависимости от требований вам может потребоваться обеспечить согласованность состояния объектов настроек.

...