DI模式概念及應(yīng)用_第1頁
DI模式概念及應(yīng)用_第2頁
DI模式概念及應(yīng)用_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

DI模式概念及應(yīng)用概念DI(依賴注入-DependencyInjection),也叫IOC(控制反轉(zhuǎn)-InversionofControl)。是指將對象的控制權(quán)從當(dāng)前對象轉(zhuǎn)移到目的類與類之間互相解耦。為什么用DI—般的面向?qū)ο箝_發(fā)過程中存在的問題在一般的面向?qū)ο蟮拈_發(fā)中,我們希望把對象的控制權(quán)完全掌握在自己手中。我們需要使用一個類(Base類)的實(shí)例的時候,就會去創(chuàng)建一個實(shí)例去使用。但我們使用的類不會只用于當(dāng)前的類。我們可能會有幾個甚至幾十個類中都依賴了這個類。那么,我們在每個使用到這個類的地方就去創(chuàng)建一個實(shí)例。這時候,問題就出現(xiàn)了,如果我們的需求發(fā)生了變更,需要改動Base類,那么在Base類改動了之后,所有使用到Base類的地方都要去進(jìn)行更改,我們不得不去改動所有用到Base類的類。這樣就造成了許多重復(fù)勞動,而且非常容易出錯,嚴(yán)重降低了開發(fā)效率。image.png那么如何去優(yōu)化呢?我們可以將對象對的創(chuàng)建權(quán)交給父級對象。我如果需要使用某個類的實(shí)例,就去請求父級對象,父級對象將該類的實(shí)例創(chuàng)建好傳遞給我,這樣我就不用關(guān)心所依賴類的具體實(shí)現(xiàn)。只需要從父級對象去拿,然后消費(fèi)。這樣當(dāng)新需求發(fā)生了變更的時候,我就只需要更改父級對象的實(shí)現(xiàn)即可。這樣就可以減少不必要的重復(fù)勞動。那么,父類如果也有一系列平級的類,他們管理著一些共同的類,那么如果需求發(fā)生變更,我還是需要做許多重復(fù)勞動。我為了減少重復(fù)勞動,就把這些對象的控制權(quán)再往上提一級,交給父類的父類…image.png就這樣一級一級的交出去,是不是就只有放到入口函數(shù)才是最合理的呢?但是我們一般不這么做。我們會將這些邏輯抽離出去,成為一個工具或框架。我們可以將一些被其他類依賴的類注冊到特定的IOC容器,然后在需要使用這些類的實(shí)例的時候,就從IOC容器去取,然后將其注入到當(dāng)前類中(DI——依賴注入)。當(dāng)然,創(chuàng)建實(shí)例并注入的操作都由框架完成。這樣,我們就很好的實(shí)現(xiàn)了對象的解耦與依賴的統(tǒng)一管理。有了依賴注入,我們可以做什么?依賴管理(理所應(yīng)當(dāng),最重要的職責(zé))單例對象管理?模塊之間共享服務(wù)實(shí)例(可以做到配置運(yùn)行時修改,例如API_HOST)簡單狀態(tài)管理,簡單場景下共享狀態(tài)更加方便特性(如果在react中使用)Hook支持,一鍵注入裝飾器支持,一個裝飾器注入依賴簡單實(shí)現(xiàn)有了這么一個思想,那么就很容易實(shí)現(xiàn)一個簡單的依賴注入工具。(這里是基本示例,沒有考慮常量注入和工廠函數(shù)注入,以及參數(shù)的處理)//containersclassContainer{providers=[];〃所有注冊過的供應(yīng)商instanceMap=newMap();//hashMap,用于保存每個供應(yīng)商的實(shí)例forRoot(providers=[]){viders=providers;};get(provider){constkey=typeofprovider==='string'?provider:;/拿到當(dāng)前供應(yīng)商對應(yīng)的keyletinstance=this.instanceMap.get(key);if(!instance){/如果實(shí)例不存在就去創(chuàng)建,然后set到map中constProvider=viders.find(p=>===key);if(Provider){thrownewError未找到對應(yīng)的供應(yīng)商);}instance=newProvider();this.instanceMap.set(key,instance);}returninstance;}}WWWWWWWWWWWWWUWVWWWWwwwww童&&:芟&毬芟&:芟:姿童&&:芟&輕&&:芟&-g-g-g-g-giig-g-g-;-;-?輕:芟&:芟&童&&&使用:constDI=Symbol('@DIContainer');//創(chuàng)建一個IOC容器實(shí)例constcontainer=newContainer();將實(shí)例掛載到全局對象上global[DI]=container;//注冊供應(yīng)商container.forRoot([Service]);//inject工具函數(shù),用于注入一個依賴functioninject(provider){returnglobal[DI].get(provider);}//測試類classTest{service:any;constructor(){this.service=inject(Service);〃使用類注入實(shí)例constservice2=inject('Service');//

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論