Где хранить настройки приложения? - PullRequest
7 голосов
/ 20 октября 2010

Недавно я обнаружил, что файл "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, полностью очищаются, что делает мой 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);

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

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

Ответы [ 9 ]

13 голосов
/ 20 октября 2010

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

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

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


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

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

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

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

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

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

  • Что если в дальнейшем вам потребуется для каждого менеджера хранить логическое значение, указывающее, хочет ли он / она получать оповещенияот тебя?С вашей текущей структурой это будет невозможно.
  • Поскольку один и тот же параметр может иметь несколько значений, как вы собираетесь обрабатывать параметры, которые должны быть уникальными?Например, на странице «О нас» должно быть только одно значение текста.Что если в базе данных хранятся два значения?
6 голосов
/ 20 октября 2010

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

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

например.

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

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

5 голосов
/ 20 октября 2010

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

SETTINGS

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

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

Ex Данные для таблицы SETTINGS

    SETTING_NAME         SETTING_VALUE

    AdminEmail            admin@mysite.com
    ErrorTrackingEmail    errors@mysite.com
5 голосов
/ 20 октября 2010

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

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

2 голосов
/ 20 октября 2010

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

1 голос
/ 20 октября 2010

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

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

1 голос
/ 20 октября 2010

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

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

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

1 голос
/ 20 октября 2010

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

settings:
name NVARCHAR(255) PRIMARY KEY
value NVARCHAR(255) NOT NULL
0 голосов
/ 20 октября 2010

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

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

...