2011-08-22 54 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中引用適用的環境spring文件。這是自動化安裝程序的一部分。

在QA環境文件,我要重新定義上述「OBJ1」移動到對象:

<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文件是沒有改變。

現在參照2個文件具有相同ID定義的目標 - 這將導致重大問題運行時錯誤會發生。

有什麼辦法,我可以包括在qa.xml和標誌等,以突出該對象定義的覆蓋在任何其他的XML文件的任何其他定義的對象具有相同的對象ID?

+1

可以裝入兩個相同的ID,這將「覆蓋」第一家上市的目標(創建之前,據我所知,他們必須在不同的文件中通過使它們通過<資源...>,因爲這個它是一個很好的參考練習將您的上下文資源按從「全局含義」開始到「本地含義」(在最後一項具有app.config的)的順序包含在內 – Beachwalker

+2

@Stegi :爲什麼不把它作爲答案?看起來像這樣解決了OP的問題 – Marijn

+1

在一個* single * xml文件中,一個'id'只能被指定一次。'id'屬性實際上是一個xml屬性 - 所以xml解析器爲您提供了額外的驗證,無論是在Visual Studio中還是在運行時加載文件時。但是,如Stegi所提到的,您可以在不同文件中指定具有相同ID的對象,並使用相同的上下文加載。來自上次加載文件的定義將覆蓋具有相同ID的任何以前的定義。 – Marijn

回答

1

代替具有相同的ID defininig對象(如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> 

然後用

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

,例如,你的web.config。

+0

這隻有在您可以更改'settings.xml'時纔有效,即將'obj1'重命名爲'ProdObj1'。從這個問題我明白,OP想要避免這一點。所以這可能是一個有用的技術 - 事實上它可能是OP的方案 - 但它需要更改'settings.xml'。 – Marijn

+0

你是指如何更改settings.xml? – amateur

+0

你的場景,我想不起來:從你的第一段我讀'obj1'是在一個文件「settings.xml」rigs中定義?此設置文件將部署到您的qa和生產環境中。在qa和生產環境中,您都會引用settings.xml,這是(無法指定的原因)您無法更改。所以在生產和qa中,'obj1'都是settings.xml中定義的一個對象。 – Marijn

6

可以裝入兩個相同的ID和最後一個ID將「覆蓋」第一家上市的目標(創建之前,他們必須通過使它們的上下文定義中引用的是在不同的文件)。

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

由於此默認行爲是一個很好的做法,包括在訂單的情況下ressources與「世界意義」(例如第三方要重用CONFIGS)下調至「局部意義」開頭(其應用.config作爲最後一項)。