Следите за изменениями настроек в app.config - PullRequest
0 голосов
/ 09 июля 2009

Когда я использую типовые безопасные настройки приложения, в моем файле app.exe.config что-то вроде этого:

<setting name="IntervalTimeout" serializeAs="String">
    <value>10</value>
</setting>

Settings.Designer.vb делает что-то вроде этого:

<Global.System.Configuration.ApplicationScopedSettingAttribute(),  _
 Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
 Global.System.Configuration.DefaultSettingValueAttribute("10")>  _
Public ReadOnly Property IntervalTimeout() As Integer
    Get
        Return CType(Me("IntervalTimeout"),Integer)
    End Get
End Property

И я могу получить доступ к настройке примерно так:

Settings.IntervalTimeout

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

Обычно я бы использовал что-то подобное во время инициализации:

AddHandler Settings.PropertyChanged, New PropertyChangedEventHandler(AddressOf Settings_PropertyChanged)

А затем реализовать обработчик событий, который проверяет имя измененного свойства и реагирует соответствующим образом.

Однако событие PropertyChanged вызывается только при вызове метода Set для свойства, а не когда кто-либо изменяет данные непосредственно в файле. Конечно, это был бы рай, но понятно, что это не так. ; -)

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

Кто-нибудь знает лучший способ? Или даже поддерживаемый?

1 Ответ

0 голосов
/ 09 июля 2009

ASP.NET отслеживает изменения в файле Web.config. Это делается с помощью класса System.Web.FileChangesMonitor (который помечен как внутренний и запечатанный), который использует другой внутренний класс System.Web.FileMonitor. Посмотрите на них в отражателе. Это может быть слишком сложно для вашей проблемы, но я бы, конечно, рассмотрел бы это, если бы у меня было подобное требование.

Это выглядит довольно сложно. Помните, что ASP.NET закрывает старое приложение и запускает новое, как только обнаруживает изменение. App.config не был спроектирован для обнаружения изменений во время работы приложения. Возможно, пересмотреть, зачем вам это нужно?

Более простой способ - перезапустить службу после внесения изменений.

...