.NET SettingsProvider/ApplicationSettingsBase кеширование

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

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

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

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

1 ответ

Решение

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

Есть несколько способов получить поведение, которое вы хотите.

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

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

Другие вопросы по тегам