2010-02-09 20 views
6

Mi aplicación asp.net tiene está utilizando un web.config para la configuración común. También tengo una sección que mapea algunos objetos de datos a cadenas de conexión, y esa sección va a ser un par de miles de líneas. Quiero mover esa sección a otro archivo de configuración "dataMappings.config", así que no doblo masivamente web.config - ¿hay un mecanismo estándar para acceder a ese archivo de configuración?Lectura de la configuración desde el archivo de configuración separado

Gracias, Andrey

Respuesta

10

En cada sección, puede definir configSource, que puede apuntar a una ruta de archivo externo. Aquí hay un ejemplo simple:

<connectionStrings configSource="myConnectionStrings.Config" /> 
<appSettings configSource="myAppSettings.Config" /> 

Sólo asegúrese de no utilizar .xml extensión de archivo, ya que puede ser vista en un navegador. .config no será atendido por el servidor web.

Debido a sus secciones de configuración todavía se definen en el web.config (lo que apunta a archivos externos), puede acceder a esta información a través de las rutas normales (WebConfigurationManager.AppSettings, WebConfigurationManager.GetSection, ConfigurationManager o los manejadores de sección personalizada según sea necesario)

+0

¿Funcionará si utilizo una sección personalizada? ¿O debo hacer algo en ese código de sección personalizado para admitir el atributo configSource? – Andrey

+0

+1 - ¡Buena respuesta, pásame! –

+0

@Andrey: esto funcionará con ** cualquier ** 'ConfigurationSection' en .NET 2.0 y en el marco. –

1

Utilicé un helper de configuración en una DLL compartida, y un archivo app.config en la DLL que usa el elemento Settings.Properties.Default editando el proyecto y configurando la pestaña de configuración. Parece que el valor no se lee a menos que recompile y vuelva a sincronizar el archivo app.config (en el dll) con la configuración del proyecto.

Esto funciona para mí. No recuerdo de dónde obtuve la inspiración. Solo incluyo esta clase en un proyecto compartido en alguna parte. permite que cualquier DLL llame a su propia configuración, lo que le permite cambiar las entradas dllFile.dll.config. Lo uso para cadenas de conexión. La advertencia es que en este método, la cadena de conexión debe ser una cadena de tipo, y no la cadena de conexión especial.

using System; 
using System.Configuration; 

namespace Shared 
{ 
    public static class ConfigurationHelper 
    { 
     public static string GetConfigValue(string keyName) 
     { 
      string codebase = System.Reflection.Assembly.GetCallingAssembly().CodeBase; 
      Uri p = new Uri(codebase); 
      string localPath = p.LocalPath.ToLowerInvariant(); 
      string executingFilename = System.IO.Path.GetFileNameWithoutExtension(localPath); 
      string sectionGroupName = "applicationSettings"; 
      string sectionName = executingFilename + ".Properties.Settings"; 
      string configName = localPath + ".config"; 
      ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); 
      fileMap.ExeConfigFilename = configName; 
      Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); 
      ConfigurationSectionGroup group = config.GetSectionGroup(sectionGroupName); 
      ClientSettingsSection section = null; 
      foreach (ClientSettingsSection sect in group.Sections) 
      { 
       if (sect.SectionInformation.Name.Equals(sectionName, StringComparison.InvariantCultureIgnoreCase)) 
       { 
        section = sect; 
        break; 
       } 
      } 
      SettingElement elem = section.Settings.Get(keyName); 
      if (elem == null) 
       return ""; 
      else 
       return elem.Value.ValueXml.InnerText.Trim(); 
     } 
    } 
} 

//in DLL 
void foo() 
{ 
    var str = ConfigurationHelper.GetSetting("ConnectionStringProd"); 
} 
Cuestiones relacionadas