Как использовать разные файлы .settings для разных сред в .NET?

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

Вопрос

.NET позволяет вам использовать файлы .settings для управления настройками приложения.Я хотел бы хранить параметры производства, разработки и тестирования отдельно таким образом, чтобы я мог сделать что-то вроде этого:

EnvironmentSettings environmentSettings;

// get the current environment (Production, Development or Test)
ApplicationEnvironment Environment = (ApplicationEnvironment)
    Enum.Parse(typeof(ApplicationEnvironment), Settings.Default.ApplicationEnvironment);

switch (Environment)
{
    case ApplicationEnvironment.Production:
        environmentSettings = Settings.Production;
        break;
    ...
}

string reportOutputLocation = environmentSettings.ReportOutputLocation;

По сути, мне нужны два отдельных класса настроек:класс общих настроек, в котором хранятся выбранные свойства среды и свойства, не относящиеся к конкретной среде, и 3 статических экземпляра второго класса, называемых EnvironmentSettings.Используемый экземпляр должен зависеть от среды, указанной в классе общих настроек.

Есть ли какой-нибудь способ сделать это, кроме ручной установки значений для всех этих параметров в статическом конструкторе или что-то в этом роде?Если мне придется это сделать, я бы предпочел просто иметь один большой класс настроек с такими свойствами, как "DevOutputLocation", "LiveOutputLocation" и т.д.

У меня может быть несколько файлов .settings в моем проекте, но это просто создает отдельные классы, которые не являются производными друг от друга.Таким образом, я мог бы создать файлы DevelopmentSettings.settings, ProductionSettings.settings и TestSettings.settings и присвоить им одинаковые свойства, но тогда мне повсюду понадобилась бы куча инструкций switch, чтобы определить, какой класс использовать, потому что они не являются производными от общего класса.

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

Решение

Я использую этот подход для файлов .config, я уверен, что это поможет и вам. Просто посмотри на Запись в блоге Скотта Хансельмана и этот вопрос.Идеология чертовски проста, но работает довольно хорошо.Все, что вам понадобится, это:

  1. создайте несколько файлов для разных конфигураций
  2. назовите их условно, напримермои.dev.настройки, мои.live.настройки
  3. создать событие после сборки (см. ссылки)
  4. наслаждайтесь =)

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

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

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

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

Выполнение проверки, чтобы определить, в какой среде вы работаете, сопряжено с небольшими накладными расходами.Если вы говорите о веб-среде, то это может означать значительное снижение производительности.Я бы рекомендовал создать три отдельных конфигурационных файла и настроить систему непрерывной интеграции и развертывания, которая обрабатывает присвоение имен и развертывание соответствующего файла настроек в зависимости от среды.В вашем случае у вас было бы три файла: Production.config, Development.config и Test.config.Затем сервер интеграции создаст копию этого файла для web.config или app.config в зависимости от среды.

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

В настоящее время я делаю что-то похожее на решение, упомянутое pdavis.Но для упрощения нескольких конфигурационных файлов я использую шаблоны T4 для создания конфигурационных файлов, специфичных для среды.Таким образом, существует один файл web.tt, который обрабатывает генерацию файла web.config по умолчанию.Каждая среда имеет свой собственный файл шаблона (qa.tt, production.tt, и т.д.), Который наследуется от web.tt и содержит любые переопределения, специфичные для среды.Любые изменения в web config - новые настройки приложения, параметры конфигурации и т.д.автоматически распространяются на все файлы конфигурации, зависящие от региона, путем регенерации шаблонов, и вам не нужно беспокоиться о синхронизации файлов с помощью инструмента diff.

Просто идея, но она может сработать...

  • Вам понадобится N + 2 файла настроек (N разные сборки;2 мастера) с содержащими одни и те же ключи.

  • Очистите свойство "Пользовательский инструмент" для всех из них, кроме одного из основных (таким образом только один, который генерирует мастер).

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

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

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

Я тоже никогда этого не делал;хотя бывают моменты, когда я жалел, что в VS нет более простого способа сделать что-то подобное.

Просто немного дополнительной информации о файлах конфигурации на основе среды .NET, не используя конкретно вашу вышеуказанную реализацию:

Корпоративная библиотека имеет эту функцию начиная с версии V3.0:Краткие сведения

Visual Studio 2010 также будет иметь эту функцию.Его называют Преобразование конфигурации

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