6

мой желаемый app.config было бы так:app.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 ...

Единственное ограничение, с которым я сталкиваюсь, это то, что слой данных, на который я ссылаюсь, должен оставаться таким же, как и это .... поэтому мне в основном нужно, чтобы мой app.config был доступен точно так же, как в настоящее время из этих других проектов ..., который является ConfigurationManager.AppSettings [afdasdf]

Сообщите мне, если это требует каких-либо разъяснений ... спасибо

ответ

4

Я пойду дальше и отвечу на свой вопрос здесь, если все в порядке. Я обнаружил, что я делаю это намного сложнее, чем есть на самом деле. Все, что вам нужно сделать, это:

<?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 для немедленной загрузки настроек, которые вы только что установили. Кроме этого, это действительно просто имена путей и тип раздела, которые я должен был решить. Я нашел ссылку ниже, чтобы быть наиболее полезной. Если у кого-то есть более элегантный способ, мне было бы интересно услышать об этом.

Here's the place I got the most out of in my research

2

Существует другой способ работы с файлами web.config для развертывания. Вы можете определить файлы web.config для конкретного развертывания, которые описывают команды редактирования базовому файлу web.config (а не повторять все). Посмотрите ответы на вопросы this SO question.

В принципе, вы можете определить файл web.debug.config и файл web.release.config, который будет объединен с базовым файлом web.config при развертывании ваших проектов.