目錄
依賴注入是什麼
Angular的DI框架
Injector注入器
总结
首頁 web前端 js教程 什麼是依賴注入?在Angular中怎麼實作?

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

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

這篇文章帶大家了解一下依賴注入,介紹一下依賴注入解決的問題和它原生的寫法是,並聊聊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

熱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

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

如何在Ubuntu 24.04上安裝Angular 如何在Ubuntu 24.04上安裝Angular Mar 23, 2024 pm 12:20 PM

Angular.js是一種可自由存取的JavaScript平台,用於建立動態應用程式。它允許您透過擴展HTML的語法作為模板語言,以快速、清晰地表示應用程式的各個方面。 Angular.js提供了一系列工具,可協助您編寫、更新和測試程式碼。此外,它還提供了許多功能,如路由和表單管理。本指南將討論在Ubuntu24上安裝Angular的方法。首先,您需要安裝Node.js。 Node.js是一個基於ChromeV8引擎的JavaScript運行環境,可讓您在伺服器端執行JavaScript程式碼。要在Ub

一文探究Angular中的服務端渲染(SSR) 一文探究Angular中的服務端渲染(SSR) Dec 27, 2022 pm 07:24 PM

你知道 Angular Universal 嗎?可以幫助網站提供更好的 SEO 支援哦!

淺析angular中怎麼使用monaco-editor 淺析angular中怎麼使用monaco-editor Oct 17, 2022 pm 08:04 PM

angular中怎麼使用monaco-editor?以下這篇文章記錄下最近的一次業務中用到的 m​​onaco-editor 在 angular 中的使用,希望對大家有幫助!

如何使用PHP和Angular進行前端開發 如何使用PHP和Angular進行前端開發 May 11, 2023 pm 04:04 PM

隨著網路的快速發展,前端開發技術也不斷改進與迭代。 PHP和Angular是兩種廣泛應用於前端開發的技術。 PHP是一種伺服器端腳本語言,可以處理表單、產生動態頁面和管理存取權限等任務。而Angular是一種JavaScript的框架,可以用來開發單一頁面應用程式和建構元件化的網頁應用程式。本篇文章將介紹如何使用PHP和Angular進行前端開發,以及如何將它們

淺析Angular中的獨立組件,看看怎麼使用 淺析Angular中的獨立組件,看看怎麼使用 Jun 23, 2022 pm 03:49 PM

這篇文章帶大家了解Angular中的獨立元件,看看怎麼在Angular中建立一個獨立元件,怎麼在獨立元件中導入已有的模組,希望對大家有幫助!

使用Angular和Node進行基於令牌的身份驗證 使用Angular和Node進行基於令牌的身份驗證 Sep 01, 2023 pm 02:01 PM

身份驗證是任何網路應用程式中最重要的部分之一。本教程討論基於令牌的身份驗證系統以及它們與傳統登入系統的差異。在本教程結束時,您將看到一個用Angular和Node.js編寫的完整工作演示。傳統身份驗證系統在繼續基於令牌的身份驗證系統之前,讓我們先來看看傳統的身份驗證系統。使用者在登入表單中提供使用者名稱和密碼,然後點擊登入。發出請求後,透過查詢資料庫在後端驗證使用者。如果請求有效,則使用從資料庫中獲取的使用者資訊建立會話,然後在回應頭中傳回會話訊息,以便將會話ID儲存在瀏覽器中。提供用於存取應用程式中受

專案過大怎麼辦?如何合理拆分Angular項目? 專案過大怎麼辦?如何合理拆分Angular項目? Jul 26, 2022 pm 07:18 PM

Angular專案過大,怎麼合理拆分它?以下這篇文章跟大家介紹一下合理分割Angular專案的方法,希望對大家有幫助!

Angular元件及其顯示屬性:了解非block預設值 Angular元件及其顯示屬性:了解非block預設值 Mar 15, 2024 pm 04:51 PM

Angular框架中元件的預設顯示行為不是區塊級元素。這種設計選擇促進了元件樣式的封裝,並鼓勵開發人員有意識地定義每個元件的顯示方式。透過明確設定CSS屬性 display,Angular組件的顯示可以完全控制,從而實現所需的佈局和響應能力。

See all articles