2011-08-22 10 views
7

Sto configurando i miei file di configurazione xml per la mia applicazione web asp.net utilizzando l'iniezione di dipendenza IOC spring.net. Ho fatto riferimento a ciascuno dei miei file di configurazione in web.config. Un esempio di impostazione nel file di configurazione spring.net (settings.xml) è:ridefinire l'oggetto spring.net in più file di configurazione

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

Questo tutto funziona correttamente.

Ora installo la mia applicazione Web in più ambienti così sto creando un file di configurazione spring.net per l'ambiente es. dev, qa, prod.

Così, quando si installa l'applicazione, nel file web.config viene fatto riferimento al file Spring Environment applicabile. Questo fa parte di un programma di installazione automatizzato.

All'interno del file dell'ambiente qa, voglio ridefinire l'oggetto di cui sopra "obj1" per:

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

Tuttavia poiché questo è automatizzato (aggiungendo il riferimento al file di ambiente), il file è settings.xml non cambiato.

E ora facendo riferimento a 2 file con un oggetto definito con lo stesso id, questo causa gravi problemi quando si verificano errori di runtime.

C'è un modo che posso includere in qa.xml e flag o simili per evidenziare questa definizione di oggetto sovrascrive qualsiasi altro oggetto definito in qualsiasi altro file xml con lo stesso ID oggetto?

+1

È possibile caricare due ID identici e questo "sovrascrive" il primo oggetto elencato (prima della creazione, AFAIK devono essere in file diversi facendoli fare riferimento tramite . Per questo motivo è un buon pratica per includere le risorse di contesto nell'ordine che inizia con "significato globale" fino a "significato locale" (con app.config nell'ultima voce). – Beachwalker

+2

@Stegi : perché non fornire questo come risposta? Sembra che questo risolva il problema dell'OP. – Marijn

+1

In un file * singolo * xml, un 'id' può essere specificato solo una volta.L'attributo 'id' è in realtà un attributo xml - quindi il parser xml offre una convalida aggiuntiva, sia in Visual Studio che durante il caricamento del file in fase di runtime. Ma come menziona Stegi, puoi specificare un oggetto con lo stesso id in file diversi, caricati dallo stesso contesto. La definizione dell'ultimo file caricato sovrascrive eventuali definizioni precedenti con lo stesso id. – Marijn

risposta

1

Invece di definire oggetti con lo stesso ID (che non è possibile menzionare Marijin) è possibile definire un alias in un file di configurazione che è possibile controllare.

E.g. si potrebbe avere

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

e

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

e quindi utilizzare

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

, ad esempio, il web.config.

+0

Funzionerà solo quando è possibile modificare 'settings.xml', cioè rinominare' obj1' in 'ProdObj1'. Dalla domanda capisco che OP vuole evitare esattamente questo. Quindi questa può essere una tecnica utile - in effetti potrebbe essere la strada da percorrere per lo scenario dell'OP - ma richiederebbe la modifica di 'settings.xml'. – Marijn

+0

come intendete cambiare settings.xml? – amateur

+0

Lo scenario come lo sottolineo: dal tuo primo paragrafo ho letto che 'obj1' è definito in un file" settings.xml "rigth? questo file di impostazioni viene distribuito al tuo qa e agli ambienti di produzione. Su qa e produzione fai riferimento a settings.xml, che (per qualche motivo non specificato) non puoi cambiare. Quindi sia su produzione che su qa, 'obj1' è un oggetto definito in settings.xml. – Marijn

6

È possibile caricare due ID identici e l'ultimo ID "sostituisce" il primo oggetto elencato (prima della creazione, devono essere in file diversi facendoli fare riferimento all'interno della definizione di contesto).

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

A causa di questo comportamento di default è una buona pratica includere i vostri le risorse di contesto nell'ordine che iniziano con (ad esempio file di configurazione 3rd party che si desidera riutilizzare) "senso globale" fino a "significato locale" (avendo app .config è l'ultima voce).

Problemi correlati