多數用戶都會將容器中的大部分對象佈署爲singleton模式。當一個singleton對象需要和另一個singleton對象協作,或者一個非singleton對象需要和另一個非singleson對象協作時,Spring.NET都能很好的處理它們的依賴關係。但是,如果對象的生存週期不同,就可能會產生問題。例如,假設一個singleton對象A要使用一個非singleton(原型)對象B,A中的每個方法都會用到B的新實例。由於A是singleton對象,容器只有會創建它一次,也就是說只有一次給A的屬性賦值的機會,所以不可能在每次A需要的時候都給它注入一個新的B。
有一種解決的辦法有點違背控制反轉原則:類A可以通過實現IObjectFactoryAware接口來獲取容器的引用,並調用GetObject("B")在每次需要的時候從容器中請求一個(新的)對象B。但這並不是一個很好的解決方案,因爲客戶代碼此時必須要和Spring.NET發生緊耦合。
通過方法注入,我們可以用更優雅的方式解決類似的問題。(摘自Spring.NET中文手冊)
一、查詢方法注入
Spring.NET可以動態覆蓋對象的抽象方法或虛方法,並且可以在容器內查找已命名對象,查詢方法注入就利用了這些功能。個人感覺查詢方法注入類似抽象工廠,爲之不同的是,可以不用寫抽象的實現代碼,通過配置文件動態的切換組件。
在lookup-method節點配置name和object屬性
實現代碼如下:
二、替換任意方法
替換任意方法在項目中使用的很少,實現方法也比較複雜。至於Spring.NET爲什麼使用替換任意方法,我還不是很清楚,如果有知道使用場景的朋友可以給我留言。我個人認爲其用途是:實現非派生類方法的重寫或在IoC框架中簡易的AOP攔截(這一點又不確定,以後我會寫AOP方面的博客)。
首先繼承IMethodReplacer接口並實現Implement方法,object[] arguments爲傳入的參數。其次在replaced-method節點配置name和replacer屬性,和增加arg-type節點且配置返回類型match屬性
代碼如下:
三、事件注入
在Spring.NET的IoC框架中,除了提供方法注入以外,還提供事件的注入。通過事件的注入,可以使架構體系的耦合降到最低。(參考 clingingboy的 Spring.NET學習筆記(3)-註冊事件注入)
在listener節點處配置event和method屬性指明事件名和綁定的方法,並增加ref節點設置object屬性來指明調用哪個IoC容器對象。
實現代碼:
調用部分代碼:
輸入效果: