6

mi app.config deseada sería así:app.config: ¿cómo puedo hacer un customSection anidada llamados appsettings ser los 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> 

... y luego tengo los grupos reales y secciones justo debajo de eso. Pero estaría contento con lo que funcione o con mejores sugerencias. Ahora he bajaron mis deseos a esto:

<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> 

Y supongo que está bien ... Lo principal que me pregunto es sobre si puedo sustituir una de estas secciones como las appsettings nivel de raíz ... sin iterar a través de ellos y agregar o crear mediante programación la configuración y guardarla. Solo quiero que el usuario pueda seleccionar un entorno, el evento select cambiará la configuración de la aplicación ...

Una de las limitaciones que estoy enfrentando es que la capa de datos a la que me refiero debe permanecer igual que es ... así que básicamente necesito que mi app.config sea accesible exactamente como lo es actualmente de estos otros proyectos ... eso es ConfigurationManager.AppSettings [afdasdf]

Avíseme si necesita alguna aclaración ... gracias

Respuesta

4

Voy a seguir adelante y responder mi propia pregunta aquí si eso está bien. Descubrí que estaba haciéndolo mucho más difícil de lo que realmente es. Todo lo que tiene que hacer es esto:

<?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> 

Así que hay una parte de mi app.config .... el resto es igual de fácil:

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(); 
    } 

Nota del obviamente importante uso del método config.Save para cargar inmediatamente la configuración que acaba de configurar. Aparte de eso, en realidad solo tengo que decidir sobre los nombres de ruta y el tipo de sección. El siguiente enlace me pareció el más útil. Si alguien tiene una manera más elegante, estaría interesado en saberlo.

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

2

Hay otra manera de lidiar con los archivos web.config específicos de la implementación. Puede definir archivos web.config específicos de la implementación que describen los comandos de edición en el archivo base web.config (en lugar de repetir todo). Eche un vistazo a las respuestas para this SO question.

Básicamente, puede definir un archivo web.debug.config y un archivo web.release.config que se fusiona con el archivo base web.config al implementar sus proyectos.

Cuestiones relacionadas