2011-08-22 12 views
7

Estoy configurando mis archivos de configuración xml para mi aplicación web asp.net utilizando la inyección de dependencia IOC spring.net. Hice referencia a cada uno de mis archivos de configuración en el web.config. Una muestra de la configuración en el archivo de configuración de spring.net (settings.xml) es:redefinir el objeto spring.net en varios archivos de configuración

<object id="obj1" 
     type="NS.Common.Cache.Class, NS.Common" 
     singleton="true" 
     init-method="Initialize" 
     destroy-method="Dispose"> 
    <property name="Name" value="My Name" /> 
</object> 

Todo funciona bien.

Ahora instalo mi aplicación web en múltiples entornos, así que estoy creando un archivo de configuración de spring.net para el entorno, por ejemplo. dev, qa, prod.

Por lo tanto, al instalar la aplicación, se hace referencia al archivo de resorte del entorno correspondiente en el archivo web.config. Esto es parte de un instalador automático.

Dentro del archivo de entorno de control de calidad, que desea volver a definir el objeto anterior "obj1" a:

<object id="obj1" 
    type="NS.Common.Cache.Class2, NS.Common" 
    singleton="true" 
    init-method="Initialize" 
    destroy-method="Dispose"> 
    <property name="Name" value="My New Name" /> 
</object> 

Sin embargo, ya que está automatizado (añadiendo la referencia al archivo de entorno), el archivo es settings.xml sin cambio.

Y ahora haciendo referencia a 2 archivos con un objeto definido con la misma ID, esto causa problemas importantes ya que se producirán errores de tiempo de ejecución.

¿Hay alguna manera de que pueda incluir en el qa.xml y marcar o similar para resaltar esta definición de objeto que anula a cualquier otro objeto definido en cualquier otro archivo xml con el mismo ID de objeto?

+1

Puede cargar dos identificadores idénticos y esto "anulará" el primer objeto enumerado (antes de la creación, AFAIK deben estar en archivos diferentes haciéndolos referenciar a través de . Debido a esto es un buen practique incluir sus recursos de contexto en el orden que comienza con "significado global" hasta "significado local" (teniendo app.config's en la última entrada). – Beachwalker

+2

@Stegi : ¿por qué no proporcionar esto como una respuesta? Parece que esto resuelve el problema de OP. – Marijn

+1

En un * xml solo archivo, un 'id' solo se puede especificar una vez.El atributo 'id' en realidad es un atributo xml, por lo que el analizador xml le brinda validación adicional, tanto en Visual Studio como al cargar el archivo en tiempo de ejecución. Pero como menciona Stegi, puede especificar un objeto con el mismo ID en diferentes archivos, cargados por el mismo contexto. La definición del último archivo cargado anula cualquier definición anterior con el mismo ID. – Marijn

Respuesta

1

En lugar de definir objetos con la misma ID (que no es posible como mencionó Marijin), podría definir un alias en un archivo de configuración que puede controlar.

E.g. usted podría tener

<object name="ProdObj1" type="NS.Common.Cache.Class, NS.Common" singleton="true"> 
    <property name="Name" value="Prod" /> 
</object> 

y

<object name="TestObj1" type="NS.Common.Cache.Class, NS.Common" singleton="true"> 
    <property name="Name" value="Test" /> 
</object> 

y luego usar

<alias name="ProdObj1" alias="obj1"/> 

en, por ejemplo, su web.config.

+0

Esto solo funcionará si puede cambiar 'settings.xml', es decir, renombrar' obj1' a 'ProdObj1'. De la pregunta entiendo que OP quiere evitar eso exactamente. Entonces, esta puede ser una técnica útil, de hecho podría ser el camino a seguir para el escenario de OP, pero requeriría cambiar 'settings.xml'. – Marijn

+0

¿Qué quieres decir con cambiar settings.xml? – amateur

+0

Su escenario tal como lo entiendo: de su primer párrafo, leí que 'obj1' se define en un archivo" settings.xml "rigth? este archivo de configuración se implementa en su qa y entornos de producción. Tanto en qa como en producción, hace referencia a settings.xml, que (por algún motivo no especificado) no puede cambiar. Entonces, tanto en producción como en qa, 'obj1' es un objeto definido en settings.xml. – Marijn

6

Puede cargar dos identificadores idénticos y la última identificación "anulará" el primer objeto enumerado (antes de la creación, deben estar en archivos diferentes haciendo que se mencionen en la definición del contexto).

<context ...> 
    <resource ... /> <!-- put your 3rd-party (read-only config here) --> 
    <resource ... /> <!-- put your override ids here --> 
</context> 

Debido a este comportamiento por defecto es una buena práctica incluir sus Recursos contexto en el orden en que comienzan con (por ejemplo, configuraciones de 3 ª parte que desee volver a utilizar) "que significa mundial" hasta "significado local" (que tiene aplicación .config es la última entrada).

Cuestiones relacionadas