国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
依賴(lài)注入是什么
Angular的DI框架
Injector注入器
總結(jié)
首頁(yè) web前端 js教程 手把手帶你了解Angular中的依賴(lài)注入

手把手帶你了解Angular中的依賴(lài)注入

Dec 02, 2022 pm 09:14 PM
angular angular.js 依賴(lài)注入

本篇文章帶大家了解一下依賴(lài)注入,介紹一下依賴(lài)注入解決的問(wèn)題和它原生的寫(xiě)法是什么,并聊聊Angular的依賴(lài)注入框架,希望對(duì)大家有所幫助!

手把手帶你了解Angular中的依賴(lài)注入

最近在Angular項(xiàng)目中經(jīng)常能碰到依賴(lài)注入這個(gè)關(guān)鍵詞,但是始終不理解它是怎么實(shí)現(xiàn)的,在Angular的官網(wǎng)上也只有關(guān)于它的使用,詳細(xì)點(diǎn)的原理并沒(méi)有說(shuō)明,所以就下來(lái)我們就從原生的寫(xiě)法來(lái)講解一下,依賴(lài)注入是用來(lái)解決什么問(wèn)題的,他用js應(yīng)該怎么去表現(xiàn)?!鞠嚓P(guān)教程推薦:《angular教程》】

依賴(lài)注入是什么

依賴(lài)注入簡(jiǎn)稱(chēng)DI,是面向?qū)ο缶幊讨械囊环N設(shè)計(jì)原則,用來(lái)減少代碼之間的耦合度。

我們先來(lái)看一段代碼

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()

假設(shè)我們用一個(gè)視頻類(lèi),它其中有一個(gè)方法 getScreenshot 獲取截圖,在實(shí)例化視頻類(lèi)的時(shí)候,需要傳入一個(gè)視頻 url 這樣的參數(shù)?,F(xiàn)在有一個(gè)筆記類(lèi),它需要去調(diào)用視頻類(lèi)下的截圖方法,那么我們就可以說(shuō),筆記類(lèi)是依賴(lài)于視頻類(lèi)的。所以在筆記類(lèi)的內(nèi)部,我們就需要去實(shí)例化視頻類(lèi),這樣才能在筆記類(lèi)中獲取視頻類(lèi)的實(shí)例對(duì)象,并且調(diào)用它里面的截圖方法。

上面代碼的耦合度過(guò)高,并不推薦使用,比方說(shuō)如果Video的視頻地址換了一個(gè),那么在Note中就需要去改變傳入的視頻url,這樣假設(shè)要是有更多的類(lèi)依賴(lài)于視頻類(lèi),那么一旦做出更改,那么所有地方都要跟著改變,非常的不方便。

接下來(lái)利用依賴(lài)注入解決上面的問(wèn)題:

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

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

我們?cè)陬?lèi)的外部去實(shí)例化視頻類(lèi),并且通過(guò)參數(shù)傳遞的方式把實(shí)例傳遞給了筆記類(lèi),通過(guò)這樣的方式就能夠成功解決耦合度過(guò)高的問(wèn)題,我們把通過(guò)參數(shù)傳遞實(shí)例的這種方式稱(chēng)為:注入。

優(yōu)點(diǎn)

通過(guò)依賴(lài)注入降低了代碼之間的耦合度,增加了代碼的可維護(hù)性。視頻類(lèi)中的代碼更改也不會(huì)去影響到筆記類(lèi)了。

Angular的DI框架

在上述實(shí)現(xiàn)的過(guò)程當(dāng)中,還是有著一個(gè)不是特別理想的地方,就是我們需要在類(lèi)的外部去實(shí)例化視頻類(lèi),雖然只有這一處,但是我們還是希望視頻類(lèi)的內(nèi)部再怎么更改,都不會(huì)影響外部代碼。

在 Angular 提供的 DI 框架中,我們就不需要自己去做視頻類(lèi)的實(shí)例化操作,它將實(shí)現(xiàn)依賴(lài)注入的過(guò)程隱藏了,對(duì)于開(kāi)發(fā)者來(lái)說(shuō),只需要使用很簡(jiǎn)單的代碼就可以使用復(fù)雜的依賴(lài)注入功能。

在 Angular 的 DI 有四個(gè)核心的概念:

  • Dependency:組件要依賴(lài)的實(shí)例對(duì)象,服務(wù)實(shí)例對(duì)象

  • Token:獲取服務(wù)實(shí)例對(duì)象的標(biāo)識(shí),在Angular會(huì)維護(hù)很多的實(shí)例對(duì)象,在我們需要獲取的時(shí)候,就需要通過(guò)標(biāo)識(shí)去獲取

  • Injector:注入器,負(fù)責(zé)創(chuàng)建維護(hù)服務(wù)類(lèi)的實(shí)例對(duì)象,并向組件中注入服務(wù)實(shí)例對(duì)象,通過(guò)參數(shù)的方式傳遞給各個(gè)組件

  • Procider:對(duì)象,用于配置注入器,指定創(chuàng)建服務(wù)實(shí)例對(duì)象的服務(wù)類(lèi)和獲取實(shí)例對(duì)象的標(biāo)識(shí)

Injector注入器

我們先通過(guò)Angular提供的基本語(yǔ)法來(lái)創(chuàng)建一個(gè)注入器

1、創(chuàng)建注入器

import { ReflectiveInjector } from "@angular/core"
//服務(wù)類(lèi)
class Video{}
//創(chuàng)建注入器并傳入服務(wù)類(lèi)
const injector = ReflectiveInjector.resolveAndCreate([ Video ])

引入ReflectiveInjector其中resolveAndCreate方法用于創(chuàng)建注入器,它接收一個(gè)數(shù)組,數(shù)組中就是需要?jiǎng)?chuàng)建實(shí)例對(duì)象的類(lèi),這個(gè)方法會(huì)返回一個(gè)注入器 2. 獲取注入器中的服務(wù)類(lèi)實(shí)例對(duì)象

const video = injector.get(Video)

在injector下有一個(gè)get方法,用于傳入標(biāo)識(shí)并且獲取實(shí)例對(duì)象,默認(rèn)標(biāo)識(shí)就是服務(wù)類(lèi)的名稱(chēng)也就是Video

這樣我們就能夠獲取到Video的實(shí)例對(duì)象了,Angular給我們提供的這套DI框架使得我們不需要去手動(dòng)的實(shí)例化某一個(gè)類(lèi)來(lái)獲得它的實(shí)例對(duì)象,它會(huì)來(lái)幫我們完成。

2、服務(wù)的實(shí)例對(duì)象為單例模式,注入器在創(chuàng)建服務(wù)實(shí)例后悔對(duì)其進(jìn)行緩存

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

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

也就是說(shuō),無(wú)論通過(guò)框架獲取多少次實(shí)例對(duì)象,他返回的都是同一個(gè)實(shí)例對(duì)象

3、但是我們可以通過(guò)創(chuàng)建多個(gè)注入器,不同的注入器返回的同一個(gè)服務(wù)實(shí)例化的對(duì)象不是同一個(gè)

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、注入器上面存在一個(gè)創(chuàng)建子級(jí)注入器的方法為 resolveAndCreateChild,這個(gè)方法會(huì)創(chuàng)建一個(gè)子級(jí)注入器,父級(jí)注入器和子級(jí)注入器之間的關(guān)系類(lèi)似于js的作用域鏈,當(dāng)前注入器查找不到就會(huì)去父級(jí)注入器查找,比如:

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

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

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

像上面這段代碼,我們?cè)趧?chuàng)建子級(jí)注入器的時(shí)候,不傳遞參數(shù),但是在子級(jí)注入器實(shí)例化的時(shí)候,由于自身不存在 Video 這個(gè)服務(wù),它就會(huì)去父級(jí)查找,當(dāng)然,就找到了父級(jí)的 Video 這個(gè)服務(wù)并且實(shí)例化,所以后面的兩個(gè)實(shí)例化對(duì)象相等

總結(jié)

本文介紹了依賴(lài)注入解決的問(wèn)題和它原生的寫(xiě)法是什么用的,并且介紹了Angular提供給我們的DI框架,用它提供給我們的簡(jiǎn)單api實(shí)現(xiàn)了實(shí)例化的過(guò)程,并且講解了注入器,也是會(huì)分層級(jí)的,能提供給我們更好地一個(gè)項(xiàng)目設(shè)計(jì)方式。之后有機(jī)會(huì)再來(lái)講解一下provider以及更多的擴(kuò)展。

更多編程相關(guān)知識(shí),請(qǐng)?jiān)L問(wèn):編程視頻!!

以上是手把手帶你了解Angular中的依賴(lài)注入的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話(huà)題

Laravel 教程
1601
29
PHP教程
1502
276
如何在Ubuntu 24.04上安裝Angular 如何在Ubuntu 24.04上安裝Angular Mar 23, 2024 pm 12:20 PM

Angular.js是一種可自由訪問(wèn)的JavaScript平臺(tái),用于創(chuàng)建動(dòng)態(tài)應(yīng)用程序。它允許您通過(guò)擴(kuò)展HTML的語(yǔ)法作為模板語(yǔ)言,以快速、清晰地表示應(yīng)用程序的各個(gè)方面。Angular.js提供了一系列工具,可幫助您編寫(xiě)、更新和測(cè)試代碼。此外,它還提供了許多功能,如路由和表單管理。本指南將討論在Ubuntu24上安裝Angular的方法。首先,您需要安裝Node.js。Node.js是一個(gè)基于ChromeV8引擎的JavaScript運(yùn)行環(huán)境,可讓您在服務(wù)器端運(yùn)行JavaScript代碼。要在Ub

如何使用PHP和Angular進(jìn)行前端開(kāi)發(fā) 如何使用PHP和Angular進(jìn)行前端開(kāi)發(fā) May 11, 2023 pm 04:04 PM

隨著互聯(lián)網(wǎng)的飛速發(fā)展,前端開(kāi)發(fā)技術(shù)也在不斷改進(jìn)和迭代。PHP和Angular是兩種廣泛應(yīng)用于前端開(kāi)發(fā)的技術(shù)。PHP是一種服務(wù)器端腳本語(yǔ)言,可以處理表單、生成動(dòng)態(tài)頁(yè)面和管理訪問(wèn)權(quán)限等任務(wù)。而Angular是一種JavaScript的框架,可以用于開(kāi)發(fā)單頁(yè)面應(yīng)用和構(gòu)建組件化的Web應(yīng)用程序。本篇文章將介紹如何使用PHP和Angular進(jìn)行前端開(kāi)發(fā),以及如何將它們

使用Angular和Node進(jìn)行基于令牌的身份驗(yàn)證 使用Angular和Node進(jìn)行基于令牌的身份驗(yàn)證 Sep 01, 2023 pm 02:01 PM

身份驗(yàn)證是任何Web應(yīng)用程序中最重要的部分之一。本教程討論基于令牌的身份驗(yàn)證系統(tǒng)以及它們與傳統(tǒng)登錄系統(tǒng)的區(qū)別。在本教程結(jié)束時(shí),您將看到一個(gè)用Angular和Node.js編寫(xiě)的完整工作演示。傳統(tǒng)身份驗(yàn)證系統(tǒng)在繼續(xù)基于令牌的身份驗(yàn)證系統(tǒng)之前,讓我們先看一下傳統(tǒng)的身份驗(yàn)證系統(tǒng)。用戶(hù)在登錄表單中提供用戶(hù)名和密碼,然后點(diǎn)擊登錄。發(fā)出請(qǐng)求后,通過(guò)查詢(xún)數(shù)據(jù)庫(kù)在后端驗(yàn)證用戶(hù)。如果請(qǐng)求有效,則使用從數(shù)據(jù)庫(kù)中獲取的用戶(hù)信息創(chuàng)建會(huì)話(huà),然后在響應(yīng)頭中返回會(huì)話(huà)信息,以便將會(huì)話(huà)ID存儲(chǔ)在瀏覽器中。提供用于訪問(wèn)應(yīng)用程序中受

Angular組件及其顯示屬性:了解非block默認(rèn)值 Angular組件及其顯示屬性:了解非block默認(rèn)值 Mar 15, 2024 pm 04:51 PM

Angular框架中組件的默認(rèn)顯示行為不是塊級(jí)元素。這種設(shè)計(jì)選擇促進(jìn)了組件樣式的封裝,并鼓勵(lì)開(kāi)發(fā)人員有意識(shí)地定義每個(gè)組件的顯示方式。通過(guò)顯式設(shè)置CSS屬性 display,Angular組件的顯示可以完全控制,從而實(shí)現(xiàn)所需的布局和響應(yīng)能力。

在Phalcon框架中使用依賴(lài)注入(Dependency Injection)的方法 在Phalcon框架中使用依賴(lài)注入(Dependency Injection)的方法 Jul 30, 2023 pm 09:03 PM

在Phalcon框架中使用依賴(lài)注入(DependencyInjection)的方法引言:在現(xiàn)代的軟件開(kāi)發(fā)中,依賴(lài)注入(DependencyInjection)是一種常見(jiàn)的設(shè)計(jì)模式,旨在提高代碼的可維護(hù)性和可測(cè)試性。而Phalcon框架作為一個(gè)快速、低耗的PHP框架,也支持使用依賴(lài)注入來(lái)管理和組織應(yīng)用程序的依賴(lài)關(guān)系。本文將向您介紹如何在Phalcon框架中

Go語(yǔ)言:依賴(lài)注入指南 Go語(yǔ)言:依賴(lài)注入指南 Apr 07, 2024 pm 12:33 PM

答案:在Go語(yǔ)言中,依賴(lài)注入可以通過(guò)接口和結(jié)構(gòu)體實(shí)現(xiàn)。定義一個(gè)描述依賴(lài)項(xiàng)行為的接口。創(chuàng)建一個(gè)實(shí)現(xiàn)該接口的結(jié)構(gòu)體。在函數(shù)中通過(guò)接口作為參數(shù)注入依賴(lài)項(xiàng)。允許在測(cè)試或不同場(chǎng)景中輕松替換依賴(lài)項(xiàng)。

使用JUnit單元測(cè)試框架進(jìn)行依賴(lài)注入 使用JUnit單元測(cè)試框架進(jìn)行依賴(lài)注入 Apr 19, 2024 am 08:42 AM

針對(duì)使用JUnit測(cè)試依賴(lài)注入,摘要如下:使用模擬對(duì)象創(chuàng)建依賴(lài)項(xiàng):@Mock注解可創(chuàng)建依賴(lài)項(xiàng)的模擬對(duì)象。設(shè)置測(cè)試數(shù)據(jù):@Before方法在每個(gè)測(cè)試方法前運(yùn)行,用于設(shè)置測(cè)試數(shù)據(jù)。配置模擬行為:Mockito.when()方法配置模擬對(duì)象的預(yù)期行為。驗(yàn)證結(jié)果:assertEquals()斷言檢查實(shí)際結(jié)果與預(yù)期值是否匹配。實(shí)際應(yīng)用:可使用依賴(lài)注入框架(如SpringFramework)注入依賴(lài)項(xiàng),通過(guò)JUnit單元測(cè)試驗(yàn)證注入的正確性和代碼的正常運(yùn)行。

解釋PHP中依賴(lài)注射(DI)的概念。 解釋PHP中依賴(lài)注射(DI)的概念。 Apr 05, 2025 am 12:07 AM

在PHP中使用依賴(lài)注入(DI)的核心價(jià)值在于實(shí)現(xiàn)松耦合的系統(tǒng)架構(gòu)。DI通過(guò)外部提供依賴(lài)的方式減少類(lèi)之間的直接依賴(lài)關(guān)系,提高代碼的可測(cè)試性和靈活性。使用DI時(shí),可以通過(guò)構(gòu)造函數(shù)、設(shè)值方法或接口注入依賴(lài),并結(jié)合IoC容器管理對(duì)象生命周期和依賴(lài)關(guān)系。

See all articles