Spring.NET學習筆記10——方法的注入(基礎篇)

多數用戶都會將容器中的大部分對象佈署爲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節點配置nameobject屬性

  實現代碼如下:

 

 

 二、替換任意方法

  替換任意方法在項目中使用的很少,實現方法也比較複雜。至於Spring.NET爲什麼使用替換任意方法,我還不是很清楚,如果有知道使用場景的朋友可以給我留言。我個人認爲其用途是:實現非派生類方法的重寫或在IoC框架中簡易的AOP攔截(這一點又不確定,以後我會寫AOP方面的博客)。
  首先繼承IMethodReplacer接口並實現Implement方法,object[] arguments爲傳入的參數。其次在replaced-method節點配置namereplacer屬性,和增加arg-type節點且配置返回類型match屬性
  代碼如下:

 

 

 

 

 三、事件注入

  在Spring.NET的IoC框架中,除了提供方法注入以外,還提供事件的注入。通過事件的注入,可以使架構體系的耦合降到最低。(參考 clingingboy的 Spring.NET學習筆記(3)-註冊事件注入)

  在listener節點處配置eventmethod屬性指明事件名和綁定的方法,並增加ref節點設置object屬性來指明調用哪個IoC容器對象。
  實現代碼:

 

 

 

 

調用部分代碼: 

 

 

 輸入效果:

 

 

 代碼下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章