Apéndice B: incluyendo archivos de configuración externos
A pesar de toda la grandeza que se encuentra en las características de configuración de .NET 2.0, hay un inconveniente. Al trabajar en un solo proyecto en múltiples entornos, la configuración de gestión puede convertirse en una pesadilla. El proceso de administrar múltiples versiones de un archivo de configuración para múltiples entornos, es decir, desarrollo, prueba, puesta en escena y producción, en mi trabajo actual implica comparaciones manuales de los archivos .config
cuando los cambios se implementan en un entorno u otro, con un proceso de fusión manual . Pasé meses intentando encontrar una mejor manera y finalmente encontré una. Ingrese una de esas tan queridas "indocumentadas" - o en este caso, solo mal documentadas - características por las que Microsoft es tan famoso: configSource
. Solo encontré esta pequeña joya cuando estaba explorando el código fuente de configuración de .NET 2.0 con Reflector, una pequeña y maravillosa herramienta.
Cada sección de configuración, cuando es analizada y cargada por las clases de configuración de .NET, tiene asignado un objeto SectionInformation
. El objeto SectionInformation
contiene metainformación sobre una sección de configuración y permite cierta administración de cómo las secciones se anulan entre sí cuando se definen en un archivo de configuración secundaria (ASP.NET). Por ahora, ignoraremos la mayoría de lo que SectionInformation tiene para ofrecer, guarde la propiedad ConfigSource
. Al agregar un atributo configSource
al elemento raíz de cualquier ConfigurationSection
, puede especificar una fuente externa alternativa a partir de la cual se cargarán las configuraciones.
<!-- SomeProgram.exe.config -->
<configuration>
<connectionStrings configSource="externalConfig/connectionStrings.config"/>
</configuration>
<!-- externalConfig/connectionStrings.config -->
<connectionStrings>
<add name="conn" connectionString="blahblah" />
</connectionStrings>
En el archivo de configuración anterior, la sección de <connectionStrings>
proceda de un archivo llamado externalConfig/connectionStrings.config
. Todas las cadenas de conexión de la aplicación se cargarán desde el archivo especificado. Ahora que las cadenas de conexión se cargan desde un recurso externo, es una cuestión relativamente simple crear un archivo connectionStrings.config
en cada entorno en la misma ubicación relativa. Por lo tanto, la externalConfig/
parte de la ruta connectionStrings.config
. La belleza aquí es que podemos definir cadenas de conexión correctamente para cada entorno una vez. No tenemos que preocuparnos de anular accidentalmente esa configuración durante una implementación en la que un archivo de configuración se combinó incorrectamente o no se fusionó en absoluto. Esto puede ser una gran ventaja cuando se implementan cambios en una aplicación en un entorno de producción, donde es crítico que existan las cadenas de conexión de base de datos correctas. La caída del uso del atributo configSource
es que requiere que todas las configuraciones se coloquen en el archivo externo. No es posible heredar ni anular, lo que en algunos casos lo hace inútil. Todos los archivos de configuración externa utilizados con el atributo configSource
también deben residir en una ruta de acceso hija relativa al archivo principal .config
. Creo que esto se trata de preocupaciones de seguridad con el almacenamiento del archivo en una ruta padre relativa en un entorno web.
Otra cosa a tener en cuenta es que la sección <appSettings>
tiene una mejor alternativa que usar configSource
, llamado archivo. Si usa el atributo de archivo en lugar de configSource con la sección <appSettings>
, puede definir la configuración tanto en el archivo raíz .config
como en el archivo al que se hace referencia. La configuración desde el archivo raíz .config
también puede anularse en el archivo al que se hace referencia, simplemente agregando algo con la misma clave. Lamentablemente, el atributo de archivo solo está disponible en la sección <appSettings>
y no está integrado en el marco de configuración. Es posible implementar un atributo similar en sus propias secciones de configuración. Esto se discutirá en una futura entrega de temas de configuración avanzada, después de varias entregas de requisitos previos;).
'puede usar el atributo configSection' - Supongo que quiere decir *' configSource' *? – Geoff
Una cosa a tener en cuenta, como acabo de descubrir, es que tiene que ser una ruta física y no puede ser una ruta UNC: ( – Perry