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 при развертывании ваших проектов.

Другие вопросы по тегам