app.config: как сделать вложенный customSection с именем appSettings в ConfigurationManager.AppSettings
Мой желаемый app.config будет выглядеть так:
<configSections>
<sectionGroup name="QA_Environment">
<section name="databases" type="System.Configuration.NameValueSectionHandler"/>
<section name="storageSystems" type="System.Configuration.NameValueSectionHandler"/>
</sectionGroup>
<sectionGroup name="Production_Environment">
<section name="databases" type="System.Configuration.NameValueSectionHandler"/>
<section name="storageSystems" type="System.Configuration.NameValueSectionHandler"/>
</sectionGroup>
</configSections>
... а потом у меня есть фактические группы и разделы прямо под этим. Но я был бы рад любым работам или лучшим предложениям. Теперь я снизил свои пожелания к этому:
<configSections>
<sectionGroup name="QA_Environment">
<section name="appSettings" type="System.Configuration.NameValueSectionHandler"/>
</sectionGroup>
<sectionGroup name="Production_Environment">
<section name="appSettings" type="System.Configuration.NameValueSectionHandler"/>
</sectionGroup>
</configSections>
И я думаю, это нормально... Главное, что меня интересует, это то, могу ли я заменить один из этих разделов на appSettings корневого уровня... без итерации по ним, программного добавления или создания конфигурации и ее сохранения. Я просто хочу, чтобы пользователь мог выбрать среду, событие выбора изменит appSettings...
Одно из ограничений, с которыми я сталкиваюсь, заключается в том, что слой данных, на который я ссылаюсь, должен оставаться таким же, как он есть... поэтому мне нужно, чтобы мой app.config был доступен точно так же, как в настоящее время из этих других проектов.... это ConfigurationManager.AppSettings [afdasdf]
Дайте мне знать, если это нужно уточнить... спасибо
2 ответа
Я пойду дальше и отвечу на свой вопрос здесь, если все в порядке. Я обнаружил, что делаю это намного сложнее, чем есть на самом деле. Все, что вам нужно сделать, это:
<?xml version="1.0" encoding="utf-8"?>
<configSections>
<sectionGroup name="Environment">
<sectionGroup name="QA">
<section name="databases" type="System.Configuration.DictionarySectionHandler"/>
<section name="storageSystems" type="System.Configuration.DictionarySectionHandler"/>
</sectionGroup>
<sectionGroup name="PROD">
<section name="databases" type="System.Configuration.DictionarySectionHandler"/>
<section name="storageSystems" type="System.Configuration.DictionarySectionHandler"/>
</sectionGroup>
</sectionGroup>
</configSections>
<Environment>
<QA>
<databases>
</databases>
<storageSystems>
</storageSystems>
</QA>
<PROD>
<databases>
</databases>
<storageSystems>
</storageSystems>
</PROD>
</Environment>
Так что есть часть моего app.config.... остальное так же просто:
private void GetConfigurationSettings(TargetEnvironments targetEnvironment)
{
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var databases = new Hashtable();
var storageSystems = new Hashtable();
switch (targetEnvironment)
{
case TargetEnvironments.QA:
databases = (Hashtable)ConfigurationManager.GetSection("Environment/QA/databases");
storageSystems = (Hashtable)ConfigurationManager.GetSection("Environment/QA/storageSystems");
break;
case TargetEnvironments.PROD:
databases = (Hashtable)ConfigurationManager.GetSection("Environment/PROD/databases");
storageSystems = (Hashtable)ConfigurationManager.GetSection("Environment/PROD/storageSystems");
break;
}
foreach (string key in databases.Keys) { config.AppSettings.Settings.Add(key, databases[key].ToString()); }
foreach (string key in storageSystems.Keys) { config.AppSettings.Settings.Add(key, storageSystems[key].ToString()); }
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
UpdateCollections();
}
Обратите внимание на очевидно важное использование метода config.Save для немедленной загрузки только что установленных настроек. Кроме этого, на самом деле мне нужно было выбрать только пути и тип раздела. Я нашел ссылку ниже, чтобы быть наиболее полезным. Если у кого-то есть более элегантный способ, мне было бы интересно услышать об этом.
Вот место, в котором я получил максимальную пользу в своих исследованиях
Существует еще один способ работы с файлами web.config, относящимися к развертыванию. Вы можете определить специфичные для развертывания файлы web.config, которые описывают команды редактирования базового файла web.config (вместо повторения всего). Посмотрите на ответы на этот вопрос.
По сути, вы можете определить файл web.debug.config и файл web.release.config, который объединяется с базовым файлом web.config при развертывании ваших проектов.