恢復內容開始 最近看了園子里的大神分享的springnet框架的知識,感覺挺不錯的,自己閑下來也研究研究springnet。這幾天看了springnet容器的基礎篇IOC和AOP,也有點個人理解分享一下,記錄一下自己的學習筆記,歡迎大家提出問題一塊研究解決。 入門springnet首先瞭解一下什麼是 ...
---恢復內容開始---
最近看了園子里的大神分享的springnet框架的知識,感覺挺不錯的,自己閑下來也研究研究springnet。這幾天看了springnet容器的基礎篇IOC和AOP,也有點個人理解分享一下,記錄一下自己的學習筆記,歡迎大家提出問題一塊研究解決。
入門springnet首先瞭解一下什麼是控制反轉,首先控制反轉(Inversion of Control,英文縮寫為IoC),也叫依賴註入(Dependency Injection)。 個人理解springnet的控制反轉及其像一個複雜的抽象工廠。控制反轉就是將原來由開發人員來創建實例的過程轉換為容器註入完成載入實例,最終實現松耦合。這點和利用抽象工廠來反射動態載入程式集完成實例的創建很相似。純屬個人理解,不足的地方望糾正一下。敘述了控制反轉的用途,下麵來說一下操作。
總結了一下實現springnet依賴註入的步驟:
- 添加程式集的引用
- 添加解析節點
- 添加spring配置節點和object配置節點
- 創建容器上下文
大致可分為上5點,不足的地方望糾正,下麵寫點代碼演示一下我的依賴註入實現以及和抽象工廠的差別:
首先新建一個介面IPerson,介面內只提供了Person的方法簽名
namespace Myspringdemo { public interface IPerson { void Person(); } }
在新建一個NewPreson類來繼承IPerson實現介面中的方法
namespace Myspringdemo { public class NewPerson : IPerson { public void Person() { Console.WriteLine("我是工廠造的人"); } } }View Code
為了與抽象工廠做對比,我又建了一個工廠類實現創建實例
namespace Myspringdemo { public class GetFactory { public static IPerson person; public static IPerson Instance() { person = CallContext.GetData("Person") as IPerson; if (person == null) { person = new NewPerson(); CallContext.SetData("Person", person); } return person; } } }GetFactory
然後我們在program類中調用一下
namespace Myspringdemo { public class Program { static void Main(string[] args) { IPerson Factoryper = GetFactory.Instance(); Factoryper.Person();//工廠實現方法 } } }
結果如下
以上是抽象工廠實現,下麵介紹一下依賴註入的實現
1.引用程式集:Common.Logging.dll和spring.core.dll
2.配置解析節點
<!--配置spring節點解析類型--> <!--configSections節點必須緊跟configuration節點後--> <configSections> <sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/> <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> </sectionGroup> </configSections>
3.配置spring節點和objects節點,並配置object節點簡單的依賴註入完畢
<!--配置spring.net節點--> <spring> <context> <resource uri="config://spring/objects"/> </context> <objects xmlns="http://www.springframework.net"> <description>描述文檔</description> <!--放置容器里的節點位置--> <!--type為將要反射的程式集,寫法為當前命名空間名.類名,命名空間名--> <object name="Myspring" type="Myspringdemo.SpringPerson,Myspringdemo"> </object> </objects> </spring>
OK節點配置完畢,下麵就是調用了,新建一個springperson類來繼承IPerson,並實現介面中的方法
namespace Myspringdemo { public class SpringPerson:IPerson { public void Person() { Console.WriteLine("我是spring造的人"); ; } } }
實現依賴註入的方法
namespace Myspringdemo { public class Program { static void Main(string[] args) { IApplicationContext ctx = ContextRegistry.GetContext();//創建上下文 IPerson per = ctx.GetObject("Myspring") as IPerson; per.Person();//依賴註入實現方法調用 IPerson Factoryper = GetFactory.Instance(); Factoryper.Person();//工廠實現方法 } } }
讓我們來列印一下看看結果
成功列印了依賴註入的結果,一開始接觸依賴註入感覺和工廠沒有太大區別,搞了幾天後,發現依賴註入的方法確實比工廠可維護性和可擴展性要好一點,效率方面可能也要好一點,這個我沒有做多瞭解,好心的園友可以糾正一下,談談不一樣的理解!
---恢復內容結束---