Use XML includes o config references en app.config para incluir la configuración de otros archivos de configuración

Tengo bloques de configuración de registro estándar, NHibernate, etc. en mi app.config y me gustaría extraerlos en un archivo XML común que pueda ser incluido como referencia por todos los archivos app.config de mis aplicaciones.

es posible?

Sí, puede usar el atributo configSource del bloque de configuración. Todos los bloques de configuración tienen este atributo, aunque no está documentado.

Ver este artículo , todo el camino en la parte inferior, apéndice B. También he pegado la siguiente sección relevante:

Apéndice B: incluye 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 archivos .config siempre que los cambios se implementan en un entorno u otro, con una fusión manual proceso. Pasé meses intentando encontrar una mejor manera y finalmente encontré una. Ingrese una de esas “no documentadas” tan queridas – o en este caso, solo 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 .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, excepto la propiedad ConfigSource . Al agregar un atributo configSource al elemento raíz de cualquier configSource de ConfigurationSection , puede especificar una fuente externa alternativa desde la cual se cargarán las configuraciones.

         

En el archivo de configuración anterior, la sección se ha obtenido 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, 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 externos utilizados con el atributo configSource también deben residir en una ruta hija relativa al archivo .config principal. 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 tiene una mejor alternativa al uso de configSource , llamado archivo. Si usa el atributo de archivo en lugar de configSource con la sección , puede definir configuraciones 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 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;).