2010-10-27 42 views
1

簡短的問題:
確實溫莎城堡有類似Spring.Net的「查找方法注入」,可以從XML配置,它提供了獲取瞬時實例的能力的東西從沒有該類的容器知道IoC容器?城堡溫莎 - 查找方法注入瞬時實例

長問題:
我是一個長期的春/ Spring.Net用戶,我一直在嘗試溫莎城堡,試圖通過端口項目移交給它。 Spring.Net有「查找方法注入」這(從Spring文檔)的概念...

Lookup方法注入容器的覆蓋受容器管理的對象方法返回的結果的能力,在容器中查找另一個命名對象。查找通常包含一個原型對象,如前一節中所述。 Spring框架使用System.Reflection.Emit命名空間中的類動態生成一個覆蓋該方法的子類來實現此方法注入。

這意味着,如果我有以下...

public class SomeTransient 
{ 
    // ... I have dependencies that need to be filled by IoC container 
} 

public class SomeClass 
{ 
    public virtual void Work() 
    { 
     var o = CreateTransient(); 
    } 

    public virtual SomeTransient CreateTransient() { } 
} 

我可以指示春天重寫CreateTransient方法,並讓該方法返回創建瞬態實例的新容器(與它的每次調用方法時都會初始化依賴項)。 這個獨特的部分是,它不需要直接鏈接到Spring框架(例如,SomeClass不必實現特定的接口)。

Castle Windsor有沒有類似的東西可以通過XML來實現?

(我最終會從XML配置搬走,但在那一刻,我只是想獲得它運行)

回答

2

城堡有更好的東西;類型工廠。 你甚至可以注入代表! http://stw.castleproject.org/Windsor.Typed-Factory-Facility-delegate-based-factories.ashx

它更好,因爲它不依賴於動態生成代碼,它看起來更乾淨。

它看起來更清潔,因爲該類不依賴於某個人重寫該方法。沒有子類化就不可能測試這個類。

如果你真的想要做這樣的事情,我希望:

public abstract class SomeClass 
{ 
    public abstract SomeTransient CreateTransient(); 
} 

但是......它再次感覺不對。

編輯2

統一2支持這幾樣委託工廠;你可以在這裏閱讀更多: http://www.truewill.net/myblog/index.php/2010/05/06/unity_2_0_combining_injectionfactory_and

感謝@eiximenis

+0

謝謝,這看起來像我需要去的方向。我從閱讀工廠文檔中看到的唯一問題是,SomeClass必須實際跟蹤瞬態的狀態並釋放創建的對象(通過工廠的Destroy),否則將不會收集垃圾,與Spring的實現不同,後者將實現垃圾收集當它超出範圍(像一個普通的對象)......這個解釋是否正確?或者我錯過了什麼? – 2010-10-27 19:09:54

+0

關於我的評論......不要誤解我的意思,因爲工廠「擁有」了這個對象,所以這個實現很有意義。只是想確保我正確解釋文檔。 – 2010-10-27 19:44:35

+0

Windsor可能會跟蹤您拉出的對象,如果它有一些與它關聯的工作,那麼當它超出範圍時必須完成。見http://kozmic.pl/archive/2010/08/19/must-windsor-track-my-components.aspx – 2010-10-27 21:31:31