依賴注入那些事兒【4】 之 IoC Container
4.1 IoC Container出現的必然性
上面討論了諸多依賴注入的話題。說道依賴注入,就不能不說IoC Container(IoC容器),那麼到底什麼是IoC容器?我們還是先來看看它的出現背景。
我們知道,軟體開發領域有句著名的論斷:不要重複發明輪子!因為軟體開發講求複用,所以,對於應用頻繁的需求,總是有人設計各種通用框架和類庫以減輕人們的開發負擔。例如,資料持久化是非常頻繁的需求,於是各種ORM框架應運而生;再如,對MVC的需求催生了Struts等一批用來實現MVC的框架。
隨著面向物件分析與設計的發展和成熟,OOA&D被越來越廣泛應用於各種專案中,然而,我們知道,用OO就不可能不用多型性,用多型性就不可能不用依賴注入,所以,依賴注入變成了非常頻繁的需求,而如果全部手工完成,不但負擔太重,而且還容易出錯。再加上反射機制的發明,於是,自然有人開始設計開發各種用於依賴注入的專用框架。這些專門用於實現依賴注入功能的元件或框架,就是IoC Container。
從這點看,IoC Container的出現有其歷史必然性。目前,最著名的IoC也許就是Java平臺上的Spring框架的IoC元件,而.NET平臺上也有Spring.NET和Unity等。
4.2 IoC Container的分類
前面曾經討論了三種依賴注入方式,但是,想通過方式對IoC Container進行分類很困難,因為現在IoC Container都設計很完善,幾乎支援所有依賴注入方式。不過,根據不同框架的特性和慣用法,還是可以講IoC Container分為兩個大類。
4.2.1 重量級IoC Container
所謂重量級IoC Container,是指一般用外部配置檔案(一般是XML)作為依賴源,並託管整個系統各個類的例項化的IoC Container。這種IoC Container,一般是承接了整個系統幾乎所有多型性的依賴注入工作,並承接了所有服務類的例項化工作,而且這些例項化依賴於一個外部配置檔案,這種IoC Container,很像通過一個檔案,定義整個系統多型結構,視野巨集大,想要很好駕馭這種IoC Container,需要一定的架構設計能力和豐富的實踐經驗。
Spring和Spring.NET是重量級IoC Container的例子。一般來說,這種IoC Container穩定性有餘而活性不足,適合進行低活多型性的依賴注入。
4.2.2 輕量級IoC Container
還有一種IoC Container,一般不依賴外部配置檔案,而主要使用傳參的Setter或Construtor注入,這種IoC Container叫做輕量級IoC Container。這種框架很靈活,使用方便,但往往不穩定,而且依賴點都是程式中的字串引數,所以,不適合需要大規模替換和相對穩定的低活多型性,而對於高活多型性,有很好的效果。
Unity是一個典型的輕量級IoC Container。
4.3 .NET平臺上典型IoC Container推介
4.3.1 Spring.NET
Spring.NET是Java平臺上Spring對.NET平臺的移植,使用方法和Spring很像,並且功能強大,是.NET平臺上大中型開發IoC Container的首選之一。除了DI外,Spring.NET也包括AOP等諸多功能。
4.3.2 Unity
對於小型專案和講求敏捷的團隊,Spring.NET可能有點太重量級,那麼可以選擇輕量級的Unity。Unity是微軟patterns & practices團隊推出的輕量級框架,非常好用,目前最新版本是1.2。
參考文獻
[1] Shivprasad koirala, Design pattern – Inversion of control and Dependency injection,http://www.codeproject.com/KB/aspnet/IOCDI.aspx
[2] Martin Fowler, Inversion of Control Containers and the Dependency Injection pattern,http://www.martinfowler.com/articles/injection.html
[4] Eric Freeman, Elisabeth Freeman. Head First Design Patterns. O’Reilly Media, 2004. ISBN 0596007142
[5] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1995. ISBN 0201633612
[6] Patrick Smacchia 著,施凡等 譯,C#和.NET2.0 平臺、語言與框架。2008.1,人民郵電出版
[7] Jeffrey Rechter 著,CLR via C#(影印版)。2008.8,人民郵電出版
本文基於署名-非商業性使用 3.0許可協議釋出,歡迎轉載,演繹,但是必須保留本文的署名張洋(包含連結),且不得用於商業目的。如您有任何疑問或者授權方面的協商,請與我聯絡。
相關推薦
依賴注入那些事兒【4】 之 IoC Container
4.1 IoC Container出現的必然性 上面討論了諸多依賴注入的話題。說道依賴注入,就不能不說IoC Container(IoC容器),那麼到底什麼是IoC容器?我們還是先來看看它的出現背景。 我們知道,軟體開發領域有句著名的論斷:不要重複發明輪子!因為軟體開發講求
依賴注入那些事兒【3】 之 依賴注入那些事兒
上面我們從需求背景的角度,講述了依賴注入的來源和定義。但是,如果依賴注入僅僅就只有這麼點東西,那也沒有什麼值得討論的了。但是,上面討論的僅僅是依賴注入的內涵,其外延還是非常廣泛的,從依賴注入衍生出了很多相關的概念與技術,下面我們討論一下依賴注入的“那些事兒”。 3.1 依賴
【雜談9】依賴注入那些事兒(轉)
今天在網上看了一篇非常不錯的文章,談論的就是著名的"依賴注入",在我學習Spring的時間,總是在思考spring的優點在哪裡,為什麼一定要使用spring框架?為什麼bean要寫在配置檔案而不new出來?為什麼要有"依賴注入"和“控制反轉“等詞彙?在這篇文章裡,我對上述概念
C#依賴注入那些事兒(一)
1 IGame遊戲公司的故事 1.1 討論會 話說有一個叫IGame的遊戲公司,正在開發一款ARPG遊戲(動作&角色扮演類遊戲,如魔獸世界、夢幻西遊這一類的遊戲)。一般這類遊戲都有一個基本的功能,就是打怪(玩家攻擊怪物,藉此獲得經驗、虛擬貨幣和虛擬裝備
Android中JNI程式設計的那些事兒 【轉】
後續可能為需要加入一些特定的模組到android中,所以JNI還需繼續熟悉起來 首先說明,Android系統不允許一個純粹使用C/C++的程式出現,它要求必須是通過Java程式碼嵌入Native C/C++——即通過JNI的方式來使用本地(Native)程式碼。因此
重構手法之簡化函數調用【4】
希望 重復 範圍對 href idt 移植 參數 不同的 lis 返回總目錄 本小節目錄 Replace Parameter with Methods(以函數取代參數) Introduce Parameter Object(引入參數對象) Remove Sett
【4】pytorch torchvision原始碼解讀之ResNet
pytorch框架中有一個非常重要且好用的包:torchvision,顧名思義這個包主要是關於計算機視覺cv的。這個包主要由3個子包組成,分別是:torchvision.datasets、torchvision.models、torchvision.transforms。
【PHP】之4個反斜槓、3個反斜槓的情況
背景: 今天在學習正則表示式,遇到了一個問題,php中4個反斜槓\在不同直譯器中的結果。 正文: 我們先來看看以下程式碼 echo '\'; 執行之後報語法錯誤,提示unexpected'\'; ',即\'; 這幾個字元出了問題 Pars
【4】SQL之top、like、通配符、in、between
fff from -c rownum 搜索 不同的 系統 指定 ron TOP字句 用於規定要返回的記錄的數目。對於擁有數千條記錄的大型表來說,TOP 子句是非常有用的。註釋:並非所有的數據庫系統都支持 TOP 子句。語法:SELECT TOP number|pe
機器學習框架ML.NET學習筆記【4】多元分類之手寫數字識別
一、問題與解決方案 通過多元分類演算法進行手寫數字識別,手寫數字的圖片解析度為8*8的灰度圖片、已經預先進行過處理,讀取了各畫素點的灰度值,並進行了標記。 其中第0列是序號(不參與運算)、1-64列是畫素值、65列是結果。 我們以64位畫素值為特徵進行多元分類,演算法採用SDCA最大熵分類演算法。
Binary classification - 聊聊評價指標的那些事兒【回憶篇】
在解決分類問題的時候,可以選擇的評價指標簡直不要太多。但基本可以分成兩2大類,我們今分別來說道說道 基於一個概率閾值判斷在該閾值下預測的準確率 衡量模型整體表現(在各個閾值下)的評價指標 在說指標之前,咱先把分類問題中會遇到的所有情況簡單過一遍。36度的北京讓我們舉個涼快一點的例子-我們預測會不會下雨!橫
Binary classification - 聊聊評價指標的那些事兒【實戰篇】
分類問題就像披著羊皮的狼,看起來天真無害用起來天雷滾滾。比如在建模前你思考過下面的問題麼? 你的分類模型輸出的概率只是用來做樣本間的相對排序,還是概率本身? 你的訓練資料本身分佈如何是否存在Imbalanced Sample? 要是您都想到了拜拜
【4】自定義下拉框
order viewport down jquer pos bottom last png 下拉框 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8
【redis】之centos6.x安裝redis3.0.x
local con releases 新建 zxvf 分享 執行 .tar.gz all centos6.9_x86_64 1、下載redis安裝包 http://download.redis.io/releases/redis-3.2.9.tar.gz 2、解壓 tar
【AMQ】之JMS Mesage structure(JMS消息結構)
api 兼容 ctu 標識 提供商 nbsp 連接 特定 ext Δ消息體:JMS API 定義了5種消息格式也叫消息類型,可以使用不同形式發送和接收數據,並可以兼容現有的消息格式 TextMessage,MapMessage,ByteMessage,StreamMessa
【java】之java代碼的執行機制
() alt 分享 str clas not roc 成員 輸入 要在JVM中執行java代碼必須要編譯為class文件,JDK是如何將Java代碼編譯為class文件,這種機制通常被稱為Java源碼編譯機制。 1、JVM定義了class文件的格式,但是並沒有定義如何將ja
【springboot】之starter pom
soc jet rep uri shel mvc must batch god SpringBoot針對不同業務提供了不同的starter pom,根據springboot版本不同可能有差異。 spring-boot-starter springboot核心start
VSTO:使用C#開發Excel、Word【4】
托管 nic tools sha 為我 exc cart man 還要 致謝雖然封面上只有兩個名字,但沒有這麽多專門人士的努力,沒有這樣大的書籍。 埃裏克·卡特(Eric Carter)感謝他的整個家庭,他們表現出的耐心,而“爸爸”正在研究他的書:傑森,海利,卡米拉,蘭德和
【4】 簡單繪圖(二)
dispose alt draw bsp rom 形狀 .html yellow tex 在上一篇裏已經向大家介紹了如何使用GDI+繪制簡單的圖像,這一篇繼續向大家介紹其它一些繪圖知識. 1.首先我們來看下上一篇中我們使用過的Pen. Pen的屬性主要有: Color(顏色
【MantisBT】之在linux環境上的安裝搭建
bts mantisbt 在工作中,選用了MantisBT作為公司的BTS工具。MantisBT的作為一款缺陷跟蹤管理系統,有以下優點:開源、 免費;可與開源的testlink集成,便於統計bug的用例發現率;具有bug關聯功能;權限設置靈活,不同角色有不同權限;具有郵件通知功能,每個用戶可根據自身的工