Использование базы данных для хранения настроек приложения

StackOverflow https://stackoverflow.com/questions/1410189

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

Я думаю, вы разгадали двух главных игроков:

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

или:

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

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

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

Другие советы

Ты мог бы используйте SQLite, который будет представлять собой автономную базу данных в одном файле.Двух зайцев одним выстрелом?

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

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

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

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

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

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

От MSDN:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top