.NET的轻量级IOC框架芮双随笔
面向對象的設計的重用性一直是他的一個重要特性,為了有效定義這一特性,又引申出面向對象設計的幾個原則:高內聚、低耦合、功能單一、優先使用聚合、面向接口編程等。依賴這些原則和前人的經驗,又發展出形形色色的模式,分析這些原則和模式可以發現,或許是因為硬件的快速升級,我們走的是一條犧牲軟件效率以提高其重用性的道路。而沿著這條路走出的另一步就是現在出現在.NET中而Java已經有了相當發展的IOC框架(以上純屬個人觀點)。目前.NET中的IOC框架較受關注的有Spring.net和Castle等。
?
????
IOC的中文直譯是控制反轉,這個概念有些大而空泛,于是有人提出了依賴注入(DI),并將其做成一種模式,所以也可以說,IOC框架是快速實現依賴注入模式的一種工具。依賴注入,顧名思義,類間的或者接口間的依賴關系并不是在編譯時就明確建立的,而是通過某種手段,在運行時建立的,或者可以稱為晚綁定、動態綁定。依賴注入又可分為3種方式:接口注入、設值注入、構造器注入。接口注入很多人在不經意的時候可能都使用過,就是在配置文件中確定對接口的調用實際上是用的是哪個具體類;設置注入針對的是類的屬性,將這些屬性的值在配置文件中注入;構造器注入針對的是包含參數的構造函數,將這些參數的值在配置文件中注入。很簡單的原理,擴展開來,就成為下邊要說到的框架。
?
????
Spring.net移植于java的spring框架,目前版本為預覽版3,它基本可以算作spring框架的.NET實現版本。Spring.net是一種低侵入式的框架,它是由一系列松散的平行框架組成。Spring.Core?
core就是一個對象工廠(ObjectFactory),?
它通過配置中的對象定義來創建對象,它的目的是消除對象的new操作。在配置文件中,除了定義對象的一些屬性外,還能定義對象之間的相互關系,這就使得對象之間的耦合延遲到了運行時,如果針對接口或抽象類進行編程,則還可以通過具體對象的不同實現來定制系統的行為?! pring.AOP?
這是按AOP聯盟的接口定義來實現的,AOP即面向截面編程,其核心是通過給對象創建一個動態代理對象來接管對象的操作,這樣就能對操作進行前置和后置處理了。Spring.Data?
這是一個由第三方實現的整合到Spring內的數據訪問組件,目前已包括了NHibernate的實現部分。Spring.NET還顯得不夠成熟,一些功能因為平臺的局限性而導致了移植上的困難。其核心為IOC框架和AOP實現框架,所有這些可以組合起來共同工作,也可以根據需要選擇其中一部分單獨工作。相對于其他框架而言,Spring.net是從java移植而來,很多思想也是直接轉嫁過來的,例如以配置文件為核心、MVC框架等,以配置文件為核心是一個爭論的話題,各說各有理,支持的人認為這提供了強大的靈活性和透明性,反對的人認為這大大增加了配置文件的復雜性和錯誤的不確定性;MVC框架是個好東西,在使用它之前,很多.NET使用者也試圖將表現層和控制層分離,并將控制層集中,只是一直沒有找到好的解決方案,個人認為這與.NET的以事件為驅動的編程模型有些關系,這種模型使得控制層很難被分離成為單獨一個有效的層。移植來的MVC框架解決了一部分的問題,但他依然有所限制,如果我們的表現層使用了一些第三方的控件,從而引入第三方的事件處理句柄和參數時,這些又會將模型、表現和控制層牢牢地結合在一起,使MVC框架失去了意義(這種理解方式為個人觀點,但對第三方控件的依賴會使MVC框架失效這個結論是被認同的)。作為從java移植來的框架,Spring.net還有一個優勢,就是Spring在java中有很多比較成熟穩定的與其他工具搭配使用的方式,而這些工具又有很多都有了.NET版本,這樣對于熟悉java的人來說,上手就變得容易了很多,可以減少很多摸索的過程。
?
????
Spring.net是一種低侵入式的(它的有些子框架是無侵入式的,例如IOC框架)框架,被他管理的組件和服務不需要具備Spring.net的特征,因此只要這些組件的業務被合理設計,他們就可以在任何需要的地方使用,從而實現他們的重用性。這部分的功能是在IOC框架中完成的。反過來說,因為這種無侵入性,任何其他框架下的或者獨立的組件都可以在Spring.net的IOC框架下被管理和使用,因此,Spring.net不但可以應用于新系統的開發,也同樣適用于對舊有系統的整合。Spring.net的IOC框架支持上邊提到的那三種依賴注入,但他比較推薦使用設值注入。如果所依賴的不是一個基本類型而是一個對象的話,框架支持自動查找裝配,只要這個被依賴者也進行了配置,但這種做法并不被作者推薦,推薦的做法是手工在配置文件中建立關聯關系。
?
????
Spring.net的AOP集成框架與其它的.NET?
AOP實現差不多,目前都還只能對具有Virtual修飾符的方法進行攔截,從而插入想要執行的代碼。對于AOP,面向方面編程單從概念上講比較難以理解,這方面比較典型的例子是記錄日志。在一個系統中各種操作都需要記錄日志,所以日志就是一個“方面”,傳統的記錄日志的方式一般是做一個公共的模塊,由需要記錄日志的組件來調用它,從設計上看,這需要建立起非常多的依賴關系,不符合低耦合的原則。而使用AOP則可以對這種情況進行解耦,它的做法是進行代碼注入。將寫好的記錄日志的代碼,使用配置文件“注入”到需要記錄日志的方法中,注入的方式包括前置、后置和包圍等。前置是將注入代碼在方法前執行,后置是將注入代碼在方法執行后執行,包圍是在方法執行前執行一部分,然后再方法執行后再執行一部分,這種方式可以讓我們聯想到事務處理也是可以這樣來做的!但是AOP也會帶來一些問題,他降低了系統設計的可預見性,使得錯誤難以被發現且增加了新手上手的難度。
?
????
Castle的整體構建與Spring.net有很多相似,他同樣是低侵入式的,由一系列可以獨自運行的子框架組成。他目前使用的版本是Release?
Candidate?
2。作為一個開源項目,它比較強調擴展性,目前他還只具備比較基本的功能,例如在自動類型轉換功能中,它僅有基本類型和繼承了IList接口的轉換,如果需要新的類型轉換,就需要用戶自己定義一個轉換器才可以。Castle主要包括以下幾個組成部分:MicroKernel、Windsor、MonoRail、Aspect#、ActiveRecord,其中MicroKernel是IOC框架的核心,也是整個Castle框架的核心,Windsor是對MicroKernel的擴展,是一個真正適合使用的IOC框架,MicroKernel/Windsor是Castle的底層核心實現,它采用IoC容器對系統進行運行期動態設置,主要包括Facilities、Components、Services三大部分。MonoRail是Castle的MVC框架,它是Ruby?
on Rail的.Net實現,這是一個MVC?
Web框架,它與傳統WebForm在控制上的不同在于WebForm采用頁控制器模式,而MVC采用前端控制器模式。在界面表達方式上MonoRail采用模板引擎輸出,模板引擎在PHP和JSP上已廣泛使用,而在ASP.NET上因為服務端控件的強大功能和易用性而很少有人使用,兩者是各有優缺點。Aspect#是Castle的AOP框架。除了自身提供的功能外,它還提供插件式的擴展,例如Nhibernate就被作為一個插件,可以在Castle中很方便地被使用。
?
????
MicroKernel和Windsor是Castle的IOC框架,通常使用的是Windsor。對于上邊提到的3種注入方式,Windsor將設值注入和構造器注入作為一種來對待,同時對于類間的依賴,不需要在配置文件中體現,這種依賴框架會自動在配置文件中查找被依賴類的配置,然后自動建立關聯關系。因此從這一點來看Castle的使用比Spring.net方便,但運行效率會低一些。
?
????
MonoRail也是一個從java移植來的MVC框架,被組合到Castle開源項目中。因此他也面對著和Spring.net?
的MVC框架一樣的問題。
?
????
ActiveRecord是構建于Nhibernate的數據訪問工具,功能強大。不過Nhibernate發展多年,直接使用會更受歡迎一些。
?
轉自:http://www.cnblogs.com/VictorLiu/archive/2007/03/27/689496.html
轉載于:https://www.cnblogs.com/ruishuang208/p/IOC-NET.html
總結
以上是生活随笔為你收集整理的.NET的轻量级IOC框架芮双随笔的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: abctod_123456
- 下一篇: Unable to load nativ