下載本文檔
版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第三章第二節(jié)《世界地形》說課稿 -2024-2025學(xué)年 人教版七年級上冊地理
- 專業(yè)食品倉庫租賃協(xié)議(2024年版)版
- 第一單元(說課稿)2024-2025學(xué)年-統(tǒng)編版語文六年級上冊
- Module8 Unit1 Why do you have cups on your heads(說課稿)-2023-2024學(xué)年外研版(一起)英語六年級下冊
- 8《煎牛排問題》(說課稿) -2024-2025學(xué)年四年級上冊數(shù)學(xué)人教版
- 2025年房屋改造設(shè)計(jì)合同
- 2025年冀教版四年級英語上冊階段測試試卷含答案
- 倍的認(rèn)識(說課稿)-2024-2025學(xué)年人教版數(shù)學(xué)三年級上冊
- 2025年冀教版九年級化學(xué)上冊月考試卷
- 咖啡館投訴處理技巧考核試卷
- 上海南洋模范2025屆高二生物第一學(xué)期期末檢測模擬試題含解析
- 網(wǎng)絡(luò)與信息安全管理責(zé)任制度
- 2024-2025學(xué)年五年級科學(xué)上冊第二單元《地球表面的變化》測試卷(教科版)
- 小區(qū)物業(yè)服務(wù)投標(biāo)方案(技術(shù)標(biāo))
- 2025屆高考數(shù)學(xué)一輪復(fù)習(xí)建議-函數(shù)與導(dǎo)數(shù)專題講座課件
- 心電圖基本知識
- 中煤電力有限公司招聘筆試題庫2024
- 消防接警員應(yīng)知應(yīng)會考試題庫大全-上(單選、多選題)
- 2024風(fēng)電場在役葉片維修全過程質(zhì)量控制技術(shù)要求
- 湖南省岳陽市岳陽樓區(qū)2023-2024學(xué)年七年級下學(xué)期期末數(shù)學(xué)試題(解析版)
- 自適應(yīng)噪聲抵消技術(shù)的研究
評論
0/150
提交評論