Как настроить файлы конфигурации, специфичные для конфигурации решения? - PullRequest
8 голосов
/ 06 января 2009

У меня есть веб-сервис, которому нужны разные настройки для разных сред (отладка, тестирование, прод.). Какой самый простой способ настроить отдельные файлы конфигурации для этих разных сред? Все, что я нахожу в Интернете, говорит мне, как использовать менеджер конфигурации для получения настроек, но не как найти конкретные настройки на основе текущей конфигурации сборки.

Ответы [ 7 ]

4 голосов
/ 06 января 2009

Я считаю, что наличие нескольких конфигурационных файлов для каждой среды работает хорошо. то есть:

  • конфиг \ local.endpoints.xml
  • config \ dev.endpoints.xml
  • config \ test.endpoints.xml
  • config \ staging.endpoints.xml
  • config \ prod.endpoints.xml

Затем я делаю ссылку на «основную» версию этого, используя встроенный атрибут configSource в web.config или app.config, например,

<appSettings configSource="config\endpoints.xml"/>

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

Каждая среда четко обозначена и контролируется без использования грязных заполнителей.

2 голосов
/ 06 января 2009

Один из способов - сохранить 3 разных файла конфигурации и выбрать их через MSBuild при развертывании.

    <Choose>
        <When Condition="$(BuildEnvironment) == 'debug'">
            <PropertyGroup>
                <ConfigFile>debug.config</ConfigFile>
            </PropertyGroup>
        </When>
        <When Condition="$(BuildEnvironment) == 'test'">
            <PropertyGroup>
                <ConfigFile>test.config</ConfigFile>
            </PropertyGroup>
        </When>
        <When Condition="$(BuildEnvironment) == 'prod'">
            <PropertyGroup>
                <ConfigFile>prod.config</ConfigFile>
            </PropertyGroup>
        </When>
    </Choose>

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

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

1 голос
/ 07 января 2009

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

Вместо этого вы могли бы иметь одну главную конфигурацию и использовать regex / xmlpoke (nant) / [your-favourite text-манипулятор] для масштабирования файла во время сборки / развертывания, чтобы вставить правильные значения для каждой среды, сохраняя настройки для все окружения в другом файле (но, главное, все вместе).

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

1 голос
/ 06 января 2009

Еще один вариант: переключиться на сохранение конфигурации вашего приложения в базе данных. Я храню значения типов в базе данных, чтобы управление этими настройками было более централизованным. Затем в моем файле конфигурации есть строка подключения, которая предназначена только для Config, и он имеет всего два ключа: уникальное значение идентификатора приложения и версию конфигурации (т. Е. "Dev", "test" и т. Д.). Затем я просто развернул нужный файл конфигурации в правильной среде.

Это может быть не совсем то, что вы ищете; это альтернатива для облегчения управления вашими данными конфигурации.

1 голос
/ 06 января 2009

В следующей версии Visual Studio эта самая вещь была объявлена ​​как новая функция. Возможно, вы можете сделать это в сценарии предварительной сборки; замена файла конфигурации на основе переменной env имя_конфигурации.

0 голосов
/ 06 января 2009

Используйте предварительно скомпилированные директивы. Пример кода:

        String configFile = String.Empty;
 #if Debug
        configFile = @"debug.config";
 #elif Test
        configFile = @"test.config";
 #elif Prod
        configFile = @"prod.config";
 #endif
        Load(configFile);

Где загружен метод загрузки файла конфигурации.

0 голосов
/ 06 января 2009

Мы используем несколько разных методов.

Environment.MachineName.config (для пользователей)

        System.Configuration.ExeConfigurationFileMap fileMap = new System.Configuration.ExeConfigurationFileMap();

        if (System.IO.File.Exists(String.Format("./{0}.config", Environment.MachineName)))
            fileMap.ExeConfigFilename = String.Format(@"./{0}.config", Environment.MachineName);
        else
            fileMap.ExeConfigFilename = "live.config";

        System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, System.Configuration.ConfigurationUserLevel.None);

# ЕСЛИ ОТЛАДКА debug.config

# IF TEST test.config

# IF PROD prod.config

            System.Configuration.ExeConfigurationFileMap fileMap = new System.Configuration.ExeConfigurationFileMap();

#if (DEBUG)
            fileMap.ExeConfigFilename = "./debug.config";
#elif (TEST)
            fileMap.ExeConfigFilename = "./test.config";
#else
            fileMap.ExeConfigFilename = "./production.config";
#endif

            System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, System.Configuration.ConfigurationUserLevel.None);

Хотя это может стать утомительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...