2012-04-02 29 views
0

我們正在將一個穩定的項目從Castle Windsor 2.5.2遷移到3.0。在遷移到Windsor 3之後,註冊xml的不同實現以及代碼爲一個接口失敗

我們使用混合的xml/api註冊。切換到3.0後,通過ctor注入並以xml定義的參數無法再解析。

舉例說明:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
... 
    <properties> 
    <frontEnd.url>http://site.com</frontEnd.url> 
    <admin.email>[email protected]</admin.email> 
    </properties> 

    <components> 
    ... 
    <component id="ServicesBootstrapperAction" 
    service="SomeNS.Startup.IBootstrapperAction" 
     type="SomeNS.Service.ServicesBootstrapperAction, Project-Service" 
     > 
     <parameters> 
     <frontEndUrl>#{frontEnd.url}</frontEndUrl> 
     <adminEmail>#{admin.email}</adminEmail> 
     <prohibitedLogins>Assets/prohibited-logins.txt</prohibitedLogins> 
     </parameters> 
    </component> 
    ... 
    </components> 
</configuration> 

和登記:

 _container.Install(
      Castle.Windsor.Installer.Configuration.FromXmlFile("project.common.config"), 
      Castle.Windsor.Installer.Configuration.FromXmlFile(String.Format("project.{0}.config", RuntimeEnvironment)) 
      ); 

試圖解決這個組件,我們得到後:

'SomeNS.Service.ServicesBootstrapperAction' is waiting for the following dependencies: 
- Parameter 'frontEndUrl' which was not provided. Did you forget to set the dependency? 
- Parameter 'adminEmail' which was not provided. Did you forget to set the dependency? 
- Parameter 'prohibitedLogins' which was not provided. Did you forget to set the dependency? 

同樣,這一點是與工作完美2.5所以我想這可能是一些沒有記錄(或者我們沒有理解)的改變。

鑑別診斷,有人嗎?

更新: 我想出了問題並找到了解決方法。我不喜歡它,但它的工作原理。

對於所有的好奇,這裏的鏈接,該項目能說明問題: https://docs.google.com/open?id=0B7XFrOzGfmirSldZUmRQeU9SZDZZVnV5UGhGaGhsUQ

請隨時告訴我,我錯了,我應該已經使用其他一些漂亮的解決方案(什麼?)。

+1

您可以創建一個獨立的失敗測試嗎? – 2012-04-03 00:44:51

+0

@MauricioScheffer,我打算去。但後來我注意到一個涉及.Unless()的代碼,它停止了工作,但仍然以某種方式被允許。長話短說,一些服務被註冊了兩次,並且在運行時被選擇了最後的註冊實現。溫莎允許這種行爲實際上是令人難過的。我仍然有168個測試需要修復。然後我會回到咆哮。 – Kostassoid 2012-04-03 13:02:13

+0

溫莎使用第一個註冊的服務,而不是最後一個,它並不難過,它非常有用並且通過設計。 – 2012-04-03 14:13:24

回答

0

我認爲這是公平的關閉這個問題,因爲我找到了解決我原來的問題。

我真正的問題是我有一個接口的幾個實現(並需要它們全部)。但是,某些實現需要參數(簡單值),這些參數自然會被移至xml配置文件,而其他實現則使用代碼中的約定進行註冊。

現在,爲了避免雙重註冊,我使用了3.0之前的.Unless(container.Kernel.HasComponent),現在它已經過時了,但編譯得很好!令人驚訝的是,.Unless(t => container.Kernel.HasComponent(t.Name))像以前一樣工作得很好!

我確定有一個解釋,但我想不出任何。

我真的很喜歡城堡,喜歡使用它。但45 kb的突破變化並不酷,對不起,夥計們。

0

嘗試從節點名稱中刪除句點。這應該沒關係,但這是我唯一可以看到的潛在問題(主要是因爲,除了XAML之外,我沒有在XML節點名稱中看到很多時段)。

+0

我也考慮過它,並試圖這樣做,但沒有成功。 – Kostassoid 2012-04-02 19:23:12

相關問題