приложение.config: как сделать вложенный customSection, называемый appSettings, ConfigurationManager.Параметр appsettings

мое желаемое приложение.конфигурация будет такой:

<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 корневого уровня...без итерации через них и программного добавления или создания настройте и сохраните его. Я просто хочу, чтобы пользователь мог выбрать среду, событие select изменит appSettings...

одно ограничение, с которым я сталкиваюсь, заключается в том, что слой данных, на который я ссылаюсь, должен оставаться таким же, как он есть....поэтому мне в основном нужно получить мое приложение.конфигурация будет доступна точно так же, как в настоящее время из этих других проектов...то есть конфигурации.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>

Итак, есть часть моего приложения.конфиг....остальное так же просто:

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 и веб.освобождать.конфигурационный файл, который объединяется с базовой сетью.файл конфигурации при развертывании проектов.