Как настроить конкретные конфигурационные файлы конфигурации решения?
У меня есть веб-служба, которая нуждается в разных настройках для разных сред (debug, test, prod). Каков самый простой способ установки отдельных файлов конфигурации для этих различных сред? Все, что я нахожу в интернете, говорит мне, как использовать configuration manager для получения параметров, но не как найти конкретные параметры на основе текущей конфигурации сборки.
7 ответов
Я считаю, что наличие нескольких файлов конфигурации для каждой среды работает хорошо. т. е.:
- config\local.конечная точка.в XML
- config\ dev.конечная точка.в XML
- config\ test.конечная точка.в XML
- config\ staging.конечная точка.в XML
- config\ prod.конечная точка.в XML
затем я ссылаюсь на" главную " версию этого, используя встроенный атрибут configSource в интернете.config или app.конфигурация, такая как
<appSettings configSource="config\endpoints.xml"/>
Я бы затем используйте процесс сборки или развертывания, чтобы скопировать правильную конфигурацию для среды вплоть до имени веб-узла.config ожидает.
каждая окружающая среда ясно обозначена и проконтролирована, без потребности грязных заполнителей.
одним из способов было бы поддерживать 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, вы можете переименовать и переместить конкретный файл конфигурации в нужное место.
все еще несколько громоздко, это имеет дополнительное преимущество перемещения к один шаг построить.
в следующей версии Visual Studio эта самая вещь была объявлена как новая функция. Возможно, вы можете сделать это в сценарии prebuild; замена файла конфигурации на основе переменной configurationname env.
еще один вариант: переключитесь на сохранение конфигурации приложения в базе данных. Я сохраняю значения типов в базе данных, чтобы управление этими параметрами было более централизованным. Тогда мой конфигурационный файл имеет строку подключения, выделенную только для Config, и имеет только два ключа: уникальное значение идентификатора приложения и версию конфигурации (т. е. "dev", "test" и т. д.). Затем я просто развертываю правильный конфигурационный файл в правильной среде.
Это может быть не совсем то, что вы ищете; это альтернатива для облегчения управления вашими данными конфигурации.
проблема, которую я имею с ответом Сианя, заключается в том, что если вы добавляете новый параметр конфигурации/конечную точку, вы должны помнить, чтобы сделать это через несколько файлов. Если вы забудете это сделать, вы узнаете только при развертывании в затронутой среде (не хорошо).
вместо этого у вас может быть одна основная конфигурация и использование regex / xmlpoke (nant)/[your-favorite-text-manipulator] для массажа файла во время сборки/развертывания, чтобы вставить правильные значения для каждой среды, сохраняя настройки для всех среды в другом файле (но принципиально все вместе).
тогда вам нужно поддерживать только один файл конфигурации и файл настроек среды - я думаю, что это делает обслуживание проще и понятнее в долгосрочной перспективе.
мы используем несколько различных методов.
окружающая среда.свойство 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);
#Если отладка отладка.config
#Если тест тест.config
#Если прод прод.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);
это может стать утомительным, хотя.
использовать предварительно скомпилированные директивы. Пример кода:
String configFile = String.Empty;
#if Debug
configFile = @"debug.config";
#elif Test
configFile = @"test.config";
#elif Prod
configFile = @"prod.config";
#endif
Load(configFile);
где метод Load загрузил файл конфигурации.