Где хранить настройки приложения?

Недавно я обнаружил, что файл «Web.Config» содержит раздел <appSettings>, который кажется подходящим для хранения настроек приложения. Черт возьми, у него даже есть программный способ доступа к файлу через стандартную системную библиотеку. Так что, будучи очень умным, я написал интерфейс для доступа к нему, а затем конкретную реализацию интерфейса, показанную здесь:

public interface IAppSettings
{
    IEnumerable<string> GetValues(string componentName, string settingName);
    IEnumerable<KeyValuePair<string, string>> GetValuePairs(string componentName, string settingName);
    void SetValues(string componentName, string settingName, IEnumerable<string> valueList, bool append);
    void SetValuePairs(string componentName, string settingName, IEnumerable<KeyValuePair<string, string>> pairList, bool append);
}

Затем я обнаружил, что сохраняет настройки обратно в "web.config" "во время работы приложения вызывает перезапуск всего приложения. Мне это кажется совершенно неразумным, потому что если я много пишу в web.config и приложение каждый раз перезагружается, то такие вещи, как HttpRuntime.Cache, полностью очищаются, что делает мой кеш бесполезным, потому что он постоянно опустошается и заполняется заново.

Поэтому мне интересно: где мне хранить настройки приложения?

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

РЕДАКТИРОВАТЬ:

Хорошо, спасибо всем, кто предложил использовать БД и потенциальную схему таблицы. Думаю, я собираюсь использовать следующую схему:

settings:
    index NUMBER NOT NULL AUTO_INCREMENT   <== Primary Key
    component NVARCHAR(255) NOT NULL
    setting NVARCHAR(255) NOT NULL
    key   NVARCHAR(255)
    value NVARCHAR(255) NOT NULL

Хотя я не думаю, что сделаю «настройку» P-Key, но вместо этого буду использовать индекс Auto-Incr. Таким образом, если у меня есть приложение, которому нужно отправить что-то нескольким менеджерам, я могу сохранить много:

index     component       setting        value
1         RequestModule   ManagerEmail   manager1@someplace
2         RequestModule   ManagerEmail   manager2@someplace

И тогда я могу использовать:

IEnumerable<string> GetValues(string componentName, string settingName);

И он вернет список адресов электронной почты, а не просто одно значение.

Имеет ли это смысл?


person Pretzel    schedule 20.10.2010    source источник
comment
Можно использовать БД для хранения настроек приложения, но сохраните настройки в кэше. Настройки в веб-конфигурации читаются быстро, так как они находятся в памяти сервера. Если вы постоянно читаете настройки на каждой странице, подумайте о добавлении кеширования в свои настройки, а также удалите их из кеша при обновлении настроек.   -  person Carlos Muñoz    schedule 20.10.2010
comment
после вашего редактирования я отредактировал свой ответ. Обратите внимание: если у вас есть два вопроса, задавайте их отдельно, вместо того, чтобы добавлять второй вопрос к предыдущему.   -  person Arseni Mourzenko    schedule 21.10.2010


Ответы (9)


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

Если вы хотите прочитать и записать настройки, наиболее очевидный способ - использовать базу данных. Кстати, у этого есть преимущество: приложение может быть размещено на нескольких серверах и при этом будет правильно считывать и записывать настройки,

Вы также можете реализовать собственное хранилище для настроек, но это, вероятно, будет сложнее и ненамного быстрее.


Чтобы ответить на ваш второй вопрос, структура вашей базы данных зависит от типа настроек, которые вы хотите сохранить.

Если вам нужно хранить разнородные уникальные записи следующим образом:

  • Почтовый адрес администратора,
  • Максимальное количество записей для отображения на главной странице веб-сайта,
  • Текст для отображения на странице "О нас",
  • Логическое значение, показывающее, разрешены ли публичные комментарии,

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

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

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

  • Что, если вам потребуется для каждого менеджера хранить логическое значение, указывающее, хочет ли он / она получать от вас оповещения? При вашей нынешней структуре это будет невозможно.
  • Поскольку один и тот же параметр может иметь несколько значений, как вы собираетесь обрабатывать параметры, которые должны быть уникальными? Например, для отображения на странице «О нас» должно быть только одно значение текста. Что, если в базе данных хранятся два значения?
person Arseni Mourzenko    schedule 20.10.2010
comment
Интересно, что я не рассматривал приложение, работающее на нескольких серверах, но это имеет смысл. В моем случае этого, скорее всего, никогда не произойдет, потому что это для внутреннего проекта компании, но это хорошо иметь в виду. - person Pretzel; 20.10.2010
comment
Интересный. Я просто искал, как сохранить значение single, поскольку было неправильно запускать таблицу базы данных, которая будет содержать только одну запись, одно целое число. Но вы говорите, что web.config обычно используется для настроек только для чтения, тоже имеет смысл. В результате вашего (превосходного) ответа я не понимаю, где лучше всего хранить целое число чтения / записи для всего приложения в веб-службе. - person dumbledad; 06.05.2014

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

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

eg.

create table Settings
(Name varchar(50) primary key,
Value varchar(50))

Если вы используете SQL Server, вы можете установить для столбца Value значение sql_variant, что позволит вам хранить различные типы данных.

person Paul Spangle    schedule 20.10.2010
comment
+1 за sql_variant. nvarchar(max) - не лучшая идея для хранения данных любого типа (не говоря уже о varchar(100)). - person Arseni Mourzenko; 20.10.2010

Он предназначен для настроек приложения, но не для настроек, которые должны динамически изменяться во время выполнения. Скорее, он предназначен для настроек, которые меняются только время от времени, и где вы ожидаете (и даже желаете) перезапуск приложения при их изменении.

Для более эфемерных настроек вы можете просто использовать простую систему базы данных - даже простой файл / XML в каталоге App_Data может работать, если ваше приложение в противном случае не использует базу данных.

person Andrew Barber    schedule 20.10.2010

Да, изменение web.config приведет к сбросу приложения. Обычно я веду таблицу настроек для хранения пар ключ-значение для настроек и доступа к ней оттуда.

НАСТРОЙКИ

SETTING_NAME   VARCHAR(100)PRIMARY KEY
SETTING_VALUE  VARCHAR(100)

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

Ex Данные для таблицы НАСТРОЙКИ

    SETTING_NAME         SETTING_VALUE

    AdminEmail            [email protected]
    ErrorTrackingEmail    [email protected]
person Shyju    schedule 20.10.2010
comment
name должен быть первичным ключом. Отдельные столбцы не имеет смысла - person abatishchev; 20.10.2010

Я обычно добавляю поле «тип» в свою таблицу настроек, чтобы получить только нужную группу настроек. Это работает для меня как способ группировки, как настройки, и их одновременного получения.

person jangeador    schedule 20.10.2010
comment
В каком сценарии вам потребуется получить группу настроек? Это в основном из соображений производительности? - person Karl Glennon; 30.04.2011
comment
Некоторые настройки сгруппированы, например DirectoryPath, если я ищу DirectoryPath, я могу просто вытащить все настройки, где type = DirectoryPath, а затем просто перебрать их. - person jangeador; 22.06.2011

Создайте таблицу с ключевыми значениями следующим образом:

settings:
name NVARCHAR(255) PRIMARY KEY
value NVARCHAR(255) NOT NULL
person abatishchev    schedule 20.10.2010

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

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

Если вы говорите о хранении настроек для каждого пользователя, вам следует проверить ASP.NET Свойства профиля.

person Justin Niessner    schedule 20.10.2010
comment
Под неразумным я имел в виду, что постоянный перезапуск приложения был побочным эффектом, который будет иметь проблемы с производительностью, с которыми я не смогу мириться. (не то чтобы причина его перезапуска была необоснованной ...) - Спасибо, что указали на свойства профиля ASP.NET. Это не совсем то, что я ищу, но я думаю, что это поможет мне с другой проблемой, с которой я столкнулся ... :-) - person Pretzel; 20.10.2010

В этом разделе файла web.config обязательно должны храниться общесистемные настройки приложения, поскольку это предотвращает жесткое кодирование значений, которые могут изменяться со временем. Нет необходимости читать их, используя свой собственный код, поскольку есть встроенный метод: используйте массив System.Configuration.ConfigurationManager.AppSettings для их извлечения (вам нужно будет добавить ссылку на сборку System.Configuration в вашем проекте). Вы также можете редактировать AppSettings с помощью инструмента администрирования веб-сайта ASP.NET (меню «Проект» -> «Конфигурация ASP.NET»).

Для значений, которые вы планируете менять чаще и пока сайт работает, разумно использовать XML-файл, облегченную базу данных (например, SQLite или SQL Server Compact) или даже текстовый файл для этих настроек.

person Dave R.    schedule 20.10.2010

Если вам нужно сохранить настройки, вы всегда можете сохранить их в настраиваемом файле конфигурации.

Я сделал это некоторое время назад, и у меня есть код для этого здесь.

person George Stocker    schedule 20.10.2010