搜尋
首頁web前端js教程什麼是依賴注入?在Angular中怎麼實作?

什麼是依賴注入?在Angular中怎麼實作?

Feb 02, 2022 am 09:00 AM
angulardi依賴注入

這篇文章帶大家了解一下依賴注入,介紹一下依賴注入解決的問題和它原生的寫法是,並聊聊Angular的依賴注入框架,希望對大家有所幫助!

什麼是依賴注入?在Angular中怎麼實作?

最近在Angular專案中經常能碰到依賴注入這個關鍵字,但是始終不理解它是怎麼實現的,在Angular的官網上也只有關於它的使用,詳細點的原理並沒有說明,所以就下來我們就從原生的寫法來講解一下,依賴注入是用來解決什麼問題的,他用js應該怎麼去表現。 【相關教學推薦:《angular教學》】

依賴注入是什麼

依賴注入簡稱DI,是物件導向程式設計中的設計原則,用來減少程式碼之間的耦合度。

我們先來看一段程式碼

class Video{
    constructor(url){}
}

class Note{
    video: Video
    constructor(){
        this.video = new Video("https://aaaaa.mp4")
    }
    
    getScreenshot(){
        this.video.getScreenshot()
    }
}

const note = new Note()
note.getScreenshot()

假設我們用一個視訊類,它其中有一個方法getScreenshot 取得截圖,在實例化視訊類別的時候,需要傳入一個視訊url 這樣的參數。現在有一個筆記類,它需要去呼叫視訊類別下的截圖方法,那麼我們就可以說,筆記類是依賴視訊類的。所以在筆記類的內部,我們就需要去實例化視訊類,這樣才能在筆記類中取得視訊類的實例對象,並且呼叫它裡面的截圖方法。

上面程式碼的耦合度過高,不建議使用,比方說如果Video的視訊位址換了一個,那麼在Note中就需要去改變傳入的視訊url,這樣假設要是有更多的類別依賴視訊類,那麼一旦做出更改,那麼所有地方都要跟著改變,非常的不方便。

接下來利用依賴注入解決上面的問題:

class Note{
    video: Video
    constructor(video: Video){
        this.video = Video;
    }
}

const video = new Video("https://aaaaa.mp4")
const note = new Note(video)

我們在類別的外部去實例化視訊類,並且透過參數傳遞的方式把實例傳遞給了筆記類,透過這樣的方式就能夠成功解決耦合度過高的問題,我們把透過參數傳遞實例的這種方式稱為:注入。

優點

透過依賴注入降低了程式碼之間的耦合度,增加了程式碼的可維護性。視訊類別中的程式碼變更也不會去影響到筆記類別了。

Angular的DI框架

在上述實現的過程當中,還是有著一個不是特別理想的地方,就是我們需要在類的外部去實例化視頻類,雖然只有這一處,但是我們還是希望視訊類別的內部再怎麼更改,都不會影響外部程式碼。

在Angular 提供的DI 框架中,我們就不需要自己去做視訊類別的實例化操作,它將實現依賴注入的過程隱藏了,對於開發者來說,只需要使用很簡單的程式碼就可以使用複雜的依賴注入功能。

在Angular 的DI 有四個核心的概念:

  • #Dependency:元件要依賴的實例對象,服務實例物件

  • Token:取得服務實例物件的標識,在Angular會維護很多的實例對象,在我們需要取得的時候,就需要透過標識去取得

  • Injector:注入器,負責建立維護服務類別的實例對象,並在元件中註入服務實例對象,透過參數的方式傳遞給各個元件

  • Procider:對象,用於配置注入器,指定建立服務實例物件的服務類別和取得實例物件的識別

Injector注入器

我們先透過Angular提供的基本語法來建立一個注入器

1、建立注入器

import { ReflectiveInjector } from "@angular/core"
//服务类
class Video{}
//创建注入器并传入服务类
const injector = ReflectiveInjector.resolveAndCreate([ Video ])

引入ReflectiveInjector其中resolveAndCreate方法用於建立注入器,它接收一個數組,數組中就是需要建立實例物件的類,這個方法會傳回一個注入器 2. 取得注入器中的服務類別實例物件

const video = injector.get(Video)

在injector下有一個get方法,用於傳入識別並且取得實例對象,預設標識就是服務類別的名稱也就是Video

這樣我們就能夠取得到Video的實例對象了,Angular給我們提供的這套DI框架使得我們不需要去手動的實例化某一個類別來獲得它的實例對象,它會來幫我們完成。

2、服務的實例對象為單例模式,注入器在創建服務實例後悔對其進行緩存

const video1 = injector.get(Video)
const video2 = injector.get(Video)

console.log(video1 === video1)//true

也就是說,無論通過框架獲取多少次實例對象,他返回的都是同一個實例物件

3、但是我們可以透過建立多個注入器,不同的注入器傳回的同一個服務實例化的物件不是同一個

const injector1 = ReflectiveInjector.resolveAndCreate([ Video ])
const injector2 = ReflectiveInjector.resolveAndCreate([ Video ])

const video1 = injector1.get(Video)
const video2 = injector2.get(Video)

console.log(video1 === video1)//false

4、注入器上面存在一個創建子級注入器的方法為resolveAndCreateChild,這個方法會創建一個子級注入器,父級注入器和子級注入器之間的關係類似於js的作用域鏈,當前註入器查找不到就會去父級注入器查找,例如:

const injector = ReflectiveInjector.resolveAndCreate([ Video ])
const injectorChild = injector.resolveAndCreateChild([])

const video1 = injector.get(Video)
const video2 = injectorChild.get(Video)

console.log(video1 === video1)//true

像上面这段代码,我们在创建子级注入器的时候,不传递参数,但是在子级注入器实例化的时候,由于自身不存在 Video 这个服务,它就会去父级查找,当然,就找到了父级的 Video 这个服务并且实例化,所以后面的两个实例化对象相等

总结

本文介绍了依赖注入解决的问题和它原生的写法是什么用的,并且介绍了Angular提供给我们的DI框架,用它提供给我们的简单api实现了实例化的过程,并且讲解了注入器,也是会分层级的,能提供给我们更好地一个项目设计方式。之后有机会再来讲解一下provider以及更多的扩展。

更多编程相关知识,请访问:编程视频!!

以上是什麼是依賴注入?在Angular中怎麼實作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:掘金社区。如有侵權,請聯絡admin@php.cn刪除
JavaScript的角色:使網絡交互和動態JavaScript的角色:使網絡交互和動態Apr 24, 2025 am 12:12 AM

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C和JavaScript:連接解釋C和JavaScript:連接解釋Apr 23, 2025 am 12:07 AM

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

從網站到應用程序:JavaScript的不同應用從網站到應用程序:JavaScript的不同應用Apr 22, 2025 am 12:02 AM

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python vs. JavaScript:比較用例和應用程序Python vs. JavaScript:比較用例和應用程序Apr 21, 2025 am 12:01 AM

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C/C在JavaScript口譯員和編譯器中的作用C/C在JavaScript口譯員和編譯器中的作用Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在行動中:現實世界中的示例和項目JavaScript在行動中:現實世界中的示例和項目Apr 19, 2025 am 12:13 AM

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript和Web:核心功能和用例JavaScript和Web:核心功能和用例Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

了解JavaScript引擎:實施詳細信息了解JavaScript引擎:實施詳細信息Apr 17, 2025 am 12:05 AM

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)