Spring.NET学习笔记10——方法的注入(基础篇) Level 200
多數用戶都會將容器中的大部分對象布署為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屬性
實現代碼如下:
Code??????<!--查詢方法-->
??????<object?id="personDao"?type="SpringNet_MethodDi.PersonDao,?SpringNet_MethodDi"?singleton="false"/>
??????<object?id="objectFactory"?type="SpringNet_MethodDi.ObjectFactory,?SpringNet_MethodDi">
????????<lookup-method?name="CreatePersonDao"?object="personDao"/>
??????</object>
?
LookupMethod????//注意,可以直接在配置中定義這個類的對象
????public?abstract?class?ObjectFactory???
????{
????????//或者可以是一個虛方法????
????????public?abstract?PersonDao?CreatePersonDao();????
????}
????public?class?PersonDao
????{
????????public?void?Save()
????????{
????????????Console.WriteLine("保存數據");
????????}
????}
?
二、替換任意方法
替換任意方法在項目中使用的很少,實現方法也比較復雜。至于Spring.NET為什么使用替換任意方法,我還不是很清楚,如果有知道使用場景的朋友可以給我留言。我個人認為其用途是:實現非派生類方法的重寫或在IoC框架中簡易的AOP攔截(這一點又不確定,以后我會寫AOP方面的博客)。
首先繼承IMethodReplacer接口并實現Implement方法,object[] arguments為傳入的參數。其次在replaced-method節點配置name和replacer屬性,和增加arg-type節點且配置返回類型match屬性
代碼如下:
??????<!--替換方法-->
??????<object?id="userDao"?type="SpringNet_MethodDi.UserDao,?SpringNet_MethodDi">
????????<replaced-method?name="GetValue"?replacer="replaceValue">
??????????<arg-type?match="String"/>
????????</replaced-method>
??????</object>
??????<object?id="replaceValue"?type="SpringNet_MethodDi.ReplaceValue,?SpringNet_MethodDi"/>
?
ReplacedMethod????public?class?UserDao
????{
????????//虛方法
????????public?virtual?string?GetValue(string?input)
????????{
????????????return?null;
????????}
????}
????//實現IMethodReplacer接口
????public?class?ReplaceValue?:?IMethodReplacer
????{
????????public?object?Implement(object?target,?MethodInfo?method,?object[]?arguments)
????????{
????????????string?value?=?(string)arguments[0];
????????????return?"獲取到:"?+?value;
????????}
????}
?
三、事件注入
在Spring.NET的IoC框架中,除了提供方法注入以外,還提供事件的注入。通過事件的注入,可以使架構體系的耦合降到最低。(參考 clingingboy的 Spring.NET學習筆記(3)-注冊事件注入)
在listener節點處配置event和method屬性指明事件名和綁定的方法,并增加ref節點設置object屬性來指明調用哪個IoC容器對象。
實現代碼:
??????<!--事件注入-->
??????<object?id="men"?type="SpringNet_MethodDi.Men,?SpringNet_MethodDi">
????????<listener?event="OpenTheDoor"?method="OpenThisDoor">
??????????<ref?object="door"/>
????????</listener>
??????</object>??????????
??????<object?id="door"?type="SpringNet_MethodDi.Door,?SpringNet_MethodDi"?/>
?
Listener????//先定義一個委托
????public?delegate?string?OpenHandler(string?arg);
????public?class?Door
????{
????????public?event?OpenHandler?OpenTheDoor;
????????public?void?OnOpen(string?arg)
????????{
????????????//調用事件
????????????if?(OpenTheDoor?!=?null)
????????????{
????????????????Console.WriteLine(OpenTheDoor(arg));
????????????}
????????}
????}
????public?class?Men
????{
????????public?string?OpenThisDoor(string?arg)
????????{
????????????return?"參數是:"?+?arg;
????????}
????}
?
調用部分代碼:
Programclass?Program
????{
????????static?void?Main(string[]?args)
????????{
????????????IApplicationContext?ctx?=?ContextRegistry.GetContext();
????????????Console.WriteLine("查詢方法");
????????????ObjectFactory?factory?=?(ObjectFactory)ctx.GetObject("objectFactory");
????????????factory.CreatePersonDao().Save();
????????????Console.WriteLine();
????????????Console.WriteLine("替換方法");
????????????UserDao?dao?=?(UserDao)ctx.GetObject("userDao");
????????????Console.WriteLine(dao.GetValue("Liu?Dong"));
????????????Console.WriteLine();
????????????Console.WriteLine("事件注冊");
????????????Door?door?=?(Door)ctx.GetObject("door");
????????????door.OnOpen("Opening!");
????????????Console.WriteLine();
????????????Console.ReadLine();
????????}
????}
?
輸入效果:
?
? 代碼下載
?
?
返回目錄
轉載于:https://www.cnblogs.com/GoodHelper/archive/2009/11/11/SpringNet_Method.html
總結
以上是生活随笔為你收集整理的Spring.NET学习笔记10——方法的注入(基础篇) Level 200的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Summer Tree 第六期完成
- 下一篇: 11月11日:一个人的情人节