原創(chuàng)|其它|編輯:郝浩|2009-11-17 10:11:51.000|閱讀 809 次
概述:多數(shù)用戶都會(huì)將容器中的大部分對(duì)象布署為singleton模式。當(dāng)一個(gè)singleton對(duì)象需要和另一個(gè)singleton對(duì)象協(xié)作,或者一個(gè)非singleton對(duì)象需要和另一個(gè)非singleson對(duì)象協(xié)作時(shí),Spring.NET都能很好的處理它們的依賴關(guān)系。但是,如果對(duì)象的生存周期不同,就可能會(huì)產(chǎn)生問題。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
多數(shù)用戶都會(huì)將容器中的大部分對(duì)象布署為singleton模式。當(dāng)一個(gè)singleton對(duì)象需要和另一個(gè)singleton對(duì)象協(xié)作,或者一個(gè)非singleton對(duì)象需要和另一個(gè)非singleson對(duì)象協(xié)作時(shí),Spring.NET都能很好的處理它們的依賴關(guān)系。但是,如果對(duì)象的生存周期不同,就可能會(huì)產(chǎn)生問題。例如,假設(shè)一個(gè)singleton對(duì)象A要使用一個(gè)非singleton(原型)對(duì)象B,A中的每個(gè)方法都會(huì)用到B的新實(shí)例。由于A是singleton對(duì)象,容器只有會(huì)創(chuàng)建它一次,也就是說只有一次給A的屬性賦值的機(jī)會(huì),所以不可能在每次A需要的時(shí)候都給它注入一個(gè)新的B。
有一種解決的辦法有點(diǎn)違背控制反轉(zhuǎn)原則:類A可以通過實(shí)現(xiàn)IObjectFactoryAware接口來獲取容器的引用,并調(diào)用GetObject("B")在每次需要的時(shí)候從容器中請(qǐng)求一個(gè)(新的)對(duì)象B。但這并不是一個(gè)很好的解決方案,因?yàn)榭蛻舸a此時(shí)必須要和發(fā)生緊耦合。
通過方法注入,我們可以用更優(yōu)雅的方式解決類似的問題。(摘自Spring.NET中文手冊(cè))
一、查詢方法注入
可以動(dòng)態(tài)覆蓋對(duì)象的抽象方法或虛方法,并且可以在容器內(nèi)查找已命名對(duì)象,查詢方法注入就利用了這些功能。個(gè)人感覺查詢方法注入類似抽象工廠,為之不同的是,可以不用寫抽象的實(shí)現(xiàn)代碼,通過配置文件動(dòng)態(tài)的切換組件。
在lookup-method節(jié)點(diǎn)配置name和object屬性
實(shí)現(xiàn)代碼如下:
二、替換任意方法
替換任意方法在項(xiàng)目中使用的很少,實(shí)現(xiàn)方法也比較復(fù)雜。至于為什么使用替換任意方法,我還不是很清楚,如果有知道使用場(chǎng)景的朋友可以給我留言。我個(gè)人認(rèn)為其用途是:實(shí)現(xiàn)非派生類方法的重寫或在框架中簡易的AOP攔截(這一點(diǎn)又不確定,以后我會(huì)寫AOP方面的博客)。
首先繼承IMethodReplacer接口并實(shí)現(xiàn)Implement方法,object[] arguments為傳入的參數(shù)。其次在replaced-method節(jié)點(diǎn)配置name和replacer屬性,和增加arg-type節(jié)點(diǎn)且配置返回類型match屬性
代碼如下:
三、事件注入
在Spring.NET的框架中,除了提供方法注入以外,還提供事件的注入。通過事件的注入,可以使架構(gòu)體系的耦合降到最低。(參考 clingingboy的 )
在listener節(jié)點(diǎn)處配置event和method屬性指明事件名和綁定的方法,并增加ref節(jié)點(diǎn)設(shè)置object屬性來指明調(diào)用哪個(gè)容器對(duì)象。
實(shí)現(xiàn)代碼:
調(diào)用部分代碼:
輸入效果:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園