2011-08-22 22 views
7

spring.netのIOC依存関係注入を使用して自分のasp.net Webアプリケーション用のxml構成ファイルを設定しています。私はweb.config内の各設定ファイルを参照しました。 spring.net設定ファイル(settings.xml)の設定例は、複数の設定ファイルでspring.netオブジェクトを再定義する

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

です。

私は複数の環境にWebアプリケーションをインストールしていますので、環境用のspring.net設定ファイルを作成しています。 dev、qa、prod。

したがって、アプリケーションをインストールするときに、該当する環境スプリングファイルがweb.configで参照されます。これは自動インストーラの一部です。私は「OBJ1」上記の目的を再定義したいQA環境ファイル内

、:

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

これは、(環境ファイルへの参照を追加する)自動化されているようしかし、settings.xmlファイルがされ変更されません。

そして、同じIDを持つ定義済みのオブジェクトを持つ2つのファイルを参照しています - これは、ランタイムエラーが発生するため、大きな問題を引き起こします。

このオブジェクト定義を強調表示するためにqa.xmlとフラグなどに含めることができる方法は、同じオブジェクトIDを持つ他のXMLファイル内の他の定義済みオブジェクトを上書きしますか?

+1

2つの同一のIDをロードすることができます。これは最初にリストされたオブジェクトを上書きします(AFAIKは別のファイルに存在する必要があります)。によって参照されます。 "グローバル意味"から "ローカル意味"(最後のエントリにapp.configのを持つ)から順にコンテキストリソースを含めるように練習してください。 – Beachwalker

+2

@Stegi :答えとして提供しないのはなぜですか?OPの問題を解決するように見えます。 – Marijn

+1

* single * xmlファイルでは、 'id'は一度しか指定できません。'id'属性は実際にはxml属性です。そのため、Visual Studioや実行時にファイルを読み込む際に、xmlパーサーによって追加の検証が行われます。しかし、Stegiが言及しているように、同じコンテキストでロードされた異なるファイルに同じIDを持つオブジェクトを指定することができます。最後にロードされたファイルからの定義は、同じidを持つ以前の定義よりも優先されます。 – Marijn

答えて

1

同じIDを持つオブジェクトを定義するのではなく(Marijinがすでに述べたように)、あなたが制御できる設定ファイルにエイリアスを定義することができます。

など。あなたは

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

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

持ち、その後、あなたのweb.configファイル、例えば、中

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

を使用することができます。

+0

これは、 'settings.xml'を変更できるとき、すなわち' obj1'の名前を 'ProdObj1'に変更するときにのみ有効です。質問から私はOPがそれをまったく避けたいと理解しています。これは便利なテクニックですが、実際にはOPのシナリオに行く方法かもしれませんが、settings.xmlを変更する必要があります。 – Marijn

+0

settings.xmlの変更はどういう意味ですか? – amateur

+0

あなたのシナリオ私はundestandそれは:最初の段落から私は 'obj1'はファイル" settings.xml "rigthで定義されていることを読んで?この設定ファイルは、qa環境と本番環境に展開されます。 qaとproductionの両方で、(何らかの不特定の理由により)変更できないsettings.xmlを参照します。したがって、productionとqaの両方で、 'obj1'はsettings.xmlで定義されたオブジェクトです。 – Marijn

6

2つの同一のIDをロードすることができます。最後のIDは最初にリストされたオブジェクトを上書きします(作成前は、コンテキスト定義内で参照することによって異なるファイルに存在する必要があります)。ので、ために、あなたのコンテキストressourcesを含めることをお勧めし、このデフォルトの動作の

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

アプリを持つ(ダウン「ローカルな意味」を「グローバルな意味」(再利用するなど、サードパーティのコンフィグ)で始まります.configの最後のエントリとして)。

関連する問題