架构师之路(5)---IoC框架
1?IoC理論的背景
??? 我們都知道在面向?qū)ο蟮膽?yīng)用中,軟件系統(tǒng)都是由N個(gè)對(duì)象組成的,它們通過彼此的合作,最終實(shí)現(xiàn)業(yè)務(wù)邏輯。
?
圖1:耦合在一起的對(duì)象
??? 如果我們打開機(jī)械式手表的后蓋,就會(huì)看到與上面類似的情形,各個(gè)齒輪分別帶動(dòng)時(shí)針、分針和秒針順時(shí)針旋轉(zhuǎn),從而在表盤上產(chǎn)生正確的時(shí)間。上圖畫的就是這樣的一個(gè)齒輪組,它擁有多個(gè)獨(dú)立的齒輪,這些齒輪相互嚙合在一起,協(xié)同工作,來共同完成某項(xiàng)任務(wù)。我們可以看到,在齒輪組中,如果有一個(gè)齒輪出了問題,就可能會(huì)影響到整個(gè)齒輪組的運(yùn)轉(zhuǎn)。
??? 齒輪組中各個(gè)齒輪之間的嚙合關(guān)系,與軟件系統(tǒng)中對(duì)象與對(duì)象之間的耦合關(guān)系,非常類似。對(duì)象之間的耦合關(guān)系是必要的,是協(xié)同工作的基礎(chǔ),當(dāng)然也是無法避免的,否則無法保證系統(tǒng)整體的正常運(yùn)轉(zhuǎn)。目前,很多工業(yè)級(jí)的應(yīng)用越來越龐大,對(duì)象之間的依賴關(guān)系也越來越復(fù)雜,就會(huì)出現(xiàn)對(duì)象之間的多重依賴性關(guān)系,因此,架構(gòu)師和設(shè)計(jì)師對(duì)系統(tǒng)進(jìn)行分析和設(shè)計(jì)將面臨很大的挑戰(zhàn)。對(duì)象之間耦合度過高的系統(tǒng),必然會(huì)出現(xiàn)牽一發(fā)而動(dòng)全身的情形。
?
?
圖2:對(duì)象之間復(fù)雜的依賴關(guān)系
??? 耦合關(guān)系不僅會(huì)出現(xiàn)在對(duì)象與對(duì)象之間,也會(huì)出現(xiàn)在軟件系統(tǒng)的各模塊之間,以及軟件系統(tǒng)和硬件系統(tǒng)之間。如何降低系統(tǒng)之間、模塊之間和對(duì)象之間的耦合度,是軟件工程永遠(yuǎn)追求的目標(biāo)之一。
??? 所以有人就提出來IOC理論,用來實(shí)現(xiàn)對(duì)象之間的“解耦”,目前已被廣泛應(yīng)用于很多項(xiàng)目中。
2?什么是控制反轉(zhuǎn)(IoC)
??? IoC是Inversion of Control的縮寫,多數(shù)書籍翻譯成“控制反轉(zhuǎn)”,還有些書籍翻譯成為“控制反向”或者“控制倒置”,這些都大同小異,我個(gè)人覺得這個(gè)翻譯有待商榷,容易引起歧義,是不是翻譯為 “控制轉(zhuǎn)移”會(huì)更好一些。
??? 1996年,Michael Mattson在一篇有關(guān)探討面向?qū)ο罂蚣艿奈恼轮?#xff0c;首先提出了IoC 這個(gè)概念。對(duì)于面向?qū)ο笤O(shè)計(jì)及編程的基本思想,前面我們已經(jīng)講了很多了,不再贅述,讀者可以參考我前面的文章,簡單來說就是把復(fù)雜系統(tǒng)分解成相互合作的對(duì)象,這些對(duì)象類的內(nèi)部實(shí)現(xiàn)是透明的,從而降低了解決問題的復(fù)雜度,而且可以靈活地被重用和擴(kuò)展。IoC理論提出的觀點(diǎn)大體是這樣的:借助于“第三方”實(shí)現(xiàn)具有依賴關(guān)系的對(duì)象之間的解耦,如下圖:
?
?圖3:IoC解耦示意圖
??? 大家看到了吧,由于引進(jìn)了中間的“第三方”,也就是IoC容器,使得A、B、C、D這4個(gè)對(duì)象沒有了耦合關(guān)系,齒輪之間的傳動(dòng)全部依靠“第三方”了,所有對(duì)象的控制權(quán)全部上繳給“第三方”,這就是“控制反轉(zhuǎn)”說法的由來,意思就是各個(gè)對(duì)象的控制權(quán)都被轉(zhuǎn)移給“第三方”了。
??? 從另一個(gè)角度來看,作為“第三方”的IoC容器成了整個(gè)系統(tǒng)的關(guān)鍵核心,它起到了一種類似“粘合劑”的作用,把系統(tǒng)中的所有對(duì)象粘合在一起發(fā)揮作用,如果沒有這個(gè)“粘合劑”,對(duì)象與對(duì)象之間會(huì)彼此失去聯(lián)系,這就是所謂的Ioc容器被稱為“粘合劑”的原因。
??? 我們?cè)侔焉蠄D中間的Ioc容器拿掉后,整個(gè)系統(tǒng)變?yōu)檫@樣的情形:
?
圖4:拿掉IoC容器后的系統(tǒng)
??? 拿掉IoC容器后,我們看到的就是系統(tǒng)開發(fā)所需要完成的全部內(nèi)容,這時(shí)候,A、B、C、D這4個(gè)對(duì)象之間已經(jīng)沒有了耦合關(guān)系,彼此毫不影響,所以當(dāng)你在實(shí)現(xiàn)Class A的時(shí)候,根本不用再考慮B、C和D了,系統(tǒng)對(duì)象之間的依賴已經(jīng)降低到了最低程度。至于IoC容器,你可以到開源組織的網(wǎng)站上找一找,里面有很多比較成熟而且Free的,使用起來非常簡便。
如果真能實(shí)現(xiàn)控制反轉(zhuǎn),對(duì)于系統(tǒng)開發(fā)而言,這將是一件多么美好的事情!
?
3?什么是依賴注入(DI)
??? 我們先看一些生活中的例子,幫助你理解依賴注入(DI):
3.1?主機(jī)和內(nèi)置硬盤
??? 我們平時(shí)所用的電腦,它的硬盤安裝在主機(jī)里面,從電腦的外部,我們是看不見硬盤的。所以,我們通常認(rèn)為,電腦的所有部件是融為一體的。
?
圖5:主機(jī)和內(nèi)置硬盤
??? 對(duì)于一體機(jī)而言,一旦出現(xiàn)了問題,我們可能無法準(zhǔn)確地判斷到底是什么零部件出現(xiàn)了問題,有可能是CPU壞了,也有可能是主板燒了,還有可能是內(nèi)存松動(dòng)了。還有的時(shí)候,比如,電腦硬盤出現(xiàn)了問題,可能導(dǎo)致整臺(tái)電腦都無法使用。從這個(gè)例子,我們可以看到部件之間“緊密耦合”的產(chǎn)生的問題:無法準(zhǔn)確的定位和診斷故障所在。這種情形,在軟件工程的理論中,稱之為可理解性和可測試性差。
??? 如果你想修理電腦的硬盤,那么在修理過程中就必須小心翼翼,不要把其它的部件再搞壞了,比如不慎把內(nèi)存給碰松動(dòng)了,硬盤固然是修好了,但整臺(tái)電腦仍然無法使用。這種情形,在軟件工程的理論中,稱之為可修改性差。
可理解性、可測試性、可修改性組成了系統(tǒng)的可維護(hù)性,一體機(jī)的可維護(hù)性就表現(xiàn)得比較差。
?
3.2?主機(jī)和USB設(shè)備
??? 大家對(duì)USB接口和設(shè)備應(yīng)該都很熟悉。自從有了USB接口,給我們使用電腦帶來了很大的方便,現(xiàn)在有很多的外部設(shè)備都支持USB接口。
?
圖6:主機(jī)和USB設(shè)備
?
??? 從軟件工程角度,我們分析一下USB帶來的好處:
1、USB設(shè)備作為主機(jī)的外部設(shè)備,在插入主機(jī)之前,與主機(jī)沒有任何的關(guān)系,兩者都可獨(dú)立進(jìn)行測試,無論兩者中的任何一方出現(xiàn)什么的問題,都不會(huì)影響另一方的運(yùn)行,所以可維護(hù)性比較好。
2、同一個(gè)USB設(shè)備可以插接到不同的支持USB的任何主機(jī),也就是USB設(shè)備可以被重復(fù)利用,所以可復(fù)用性比較好。
3、支持熱插拔,只要是支持USB接口的設(shè)備都可以接入,所以可擴(kuò)展性比較好,非常靈活。
3.3?依賴注入
??? 2004年,Martin Fowler從另一個(gè)角度來思考這個(gè)問題,提出了“哪些方面的控制被反轉(zhuǎn)了?”這樣一個(gè)問題,并給出了答案:“依賴對(duì)象的獲得被反轉(zhuǎn)”。于是,他給“控制反轉(zhuǎn)”取了一個(gè)他認(rèn)為更合適的名字叫做“依賴注入(Dependency Injection)”。他的這個(gè)答案,實(shí)際上點(diǎn)明了實(shí)現(xiàn)IoC理論的解決方法。所謂依賴注入,就是由IoC容器在運(yùn)行期間,動(dòng)態(tài)地將某種依賴關(guān)系注入到對(duì)象之中。
??? 依賴注入(DI)和控制反轉(zhuǎn)(IoC)是從不同的角度的描述的同一件事情,都是指通過引入第三方,即IoC容器,實(shí)現(xiàn)軟件系統(tǒng)中對(duì)象之間的解耦。
??? 控制反轉(zhuǎn)能夠帶給系統(tǒng)開發(fā)的好處,與USB機(jī)制帶來的好處基本類似,而且依賴注入的實(shí)現(xiàn)跟USB機(jī)制也完全一樣。USB機(jī)制是現(xiàn)實(shí)中依賴注入的很好的案例。我們用一個(gè)實(shí)際的例子,分析一下USB機(jī)制:
任務(wù):主機(jī)通過USB接口讀取一個(gè)文件。
思路:首先,必須制定一個(gè)USB接口標(biāo)準(zhǔn),主機(jī)對(duì)USB設(shè)備的訪問嚴(yán)格按照USB接口標(biāo)準(zhǔn),USB設(shè)備提供的功能也必須符合USB接口標(biāo)準(zhǔn)。
??? 當(dāng)主機(jī)需要獲取一個(gè)文件的時(shí)候,它直接去讀取USB接口,根本不會(huì)關(guān)心USB接口上連接的是什么設(shè)備。
如果我給主機(jī)連接上一個(gè)U盤,那么主機(jī)就從U盤上讀取文件;如果我給主機(jī)連接上一個(gè)外接硬盤,那么主機(jī)就從外接硬盤上讀取文件。選取何種外部設(shè)備的權(quán)力由我說了算,也就是控制權(quán)歸我。
至此,依賴注入的思路已經(jīng)非常清楚:當(dāng)主機(jī)需要讀取文件的時(shí)候,我就把它所要依賴的外部設(shè)備,挑出來一個(gè),幫他掛接上。這個(gè)過程就是一個(gè)被依賴的對(duì)象在系統(tǒng)運(yùn)行時(shí)被注入另外一個(gè)對(duì)象內(nèi)部的過程。在這個(gè)過程中,我就起到了IoC容器的作用。
??? 我們?cè)侔岩蕾囎⑷霊?yīng)用到軟件工程中:
??? Class A依賴于Class B,當(dāng)Class A需要用到Class B的時(shí)候,IoC容器就會(huì)立刻創(chuàng)建一個(gè)Class B送給Class A使用。IoC容器就是一個(gè)類制造工廠,你需要什么,直接來拿,直接用就可以了,而不需要去關(guān)心你所用的東西是如何制成的,也不用關(guān)心最后是怎么被銷毀的,這一切全由IoC容器包辦。
?
? 4?實(shí)現(xiàn)IoC容器
?----------------------------------------------------
后記:之所以突然跳躍到39,是因?yàn)橛械耐瑢W(xué)基礎(chǔ)比較好,已經(jīng)沒有必要閱讀有關(guān)面向?qū)ο蟆⒃O(shè)計(jì)模式以及軟件工程的基本理論,那么可以從這里開始閱讀。基礎(chǔ)需要繼續(xù)補(bǔ)全的同學(xué),可以從4繼續(xù)看,我會(huì)定期在兩個(gè)方向進(jìn)行更新。框架理論,是架構(gòu)師知識(shí)體系中非常重要的部分,我會(huì)逐步結(jié)合實(shí)例,把常見的一些框架方面的知識(shí)與大家共享。
轉(zhuǎn)載于:https://www.cnblogs.com/encounter/archive/2009/03/08/2189049.html
總結(jié)
以上是生活随笔為你收集整理的架构师之路(5)---IoC框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IIS网站的权限设置问题
- 下一篇: Web前端 工具集