Использование базы данных для хранения настроек приложения - PullRequest
4 голосов
/ 11 сентября 2009

Я ищу способы сделать наше приложение более расширяемым и простым в обращении без необходимости изменять web.config (или, в нашем случае, файлы application.config, которые содержат узел appsettings).

Один из способов, о котором я подумал, - это сохранить настройки приложения в таблице базы данных с зависимостью sqlcache. Это означает, что:

  • Каждый раз, когда параметр изменяется в базе данных, кеш становится недействительным, и настройки извлекаются снова, таким образом, обновляя приложение в реальном времени, не изменяя файлы и перезапуская все приложение.
  • Мы можем создать собственный инструмент, который позволяет нам изменять настройки.

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

Есть ли способ обойти это?

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

Ответы [ 3 ]

4 голосов
/ 11 сентября 2009

Я думаю, что вы прибили двух главных игроков:

  • либо у вас есть доступ к файловой системе, и вы помещаете все свои настройки в множество файлов * .config

OR

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

Оба подхода имеют свои плюсы и минусы. Я долго пытался найти способ «материализовать» раздел конфигурации из поля базы данных, чтобы я мог просто использовать XML-файл конфигурации, но хранить его в поле базы данных. К сожалению, вся конфигурируемая система .NET 2.0 очень сильно «заблокирована» и просто предполагает, что данные будут поступать из файлов - нет способа подключиться, например. поставщик базы данных, позволяющий системе конфигурации считывать ее содержимое из поля базы данных :-( Действительно, плохо!

Единственный другой подход, который я видел, - это «ConfigurationService» в образце приложения StockTrader 2.0 , предоставляемом Microsoft, но для моих нужд это было излишним и очень сложным, очень тяжелым Весовая подсистема.

2 голосов
/ 11 сентября 2009

Вы можете использовать SQLite, который будет автономной БД в одном файле. Две птицы одним камнем?

2 голосов
/ 11 сентября 2009

Если вы ссылаетесь на внешний конфигурационный файл, который содержит настройки приложения (оставляя все остальное в обычном файле app.config), то я считаю, что редактирование только перезагружает эти настройки, но не заставляет перезапускать все приложение.

Здесь есть похожий вопрос по теме: Вложенные файлы app.config (web.config)

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

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

Редактировать: Немного дополнительной информации:

Изменения конфигурации вызывают перезапуск домена приложения

С MSDN :

Изменения параметров конфигурации в файлах Web.config косвенно приводят к перезапуску домена приложения. Такое поведение происходит по замыслу. При желании вы можете использовать атрибут configSource для ссылки на внешние файлы конфигурации, которые не вызывают перезапуск при внесении изменений. Для получения дополнительной информации см. ConfigSource в Общих Атрибутах, Унаследованных Элементами Раздела.

Дополнительная информация о классе ConfigurationManager в пространстве имен System.Configuration , который можно использовать для программного изменения файлов конфигурации (т. Е. В пользовательском инструменте, если соответствующие разрешения на чтение с диска могут предоставляться). Если вы будете использовать встроенные классы конфигурации, я думаю, что изменение внешних конфигураций не приведет к перезапуску приложения, но вызовет события (такие как свойство change ), которые вы можете обработать, чтобы гарантировать, что ваш код не заразился изменением настроек.

...