依賴注入的好處主要是松耦合的方式編寫代碼,可測性和可重用性更高。
1.注入器
每個組件都有一個注入器實例負責(zé)注入組件需要的對象,注入器是angular提供的一個服務(wù)類,一般情況下你不需要直接調(diào)用注入器的方法,注入器會自動地通過組件的構(gòu)造函數(shù)將組件所需的對象注入進組件。
constructor(private productService: ProductService){...}
// tips: 控制反轉(zhuǎn) Inversion of Control 簡稱IOC 把依賴的控制權(quán)從代碼的內(nèi)部轉(zhuǎn)移到代碼的外部(代碼對外的依賴是由代碼的內(nèi)部決定的)
1.側(cè)重于描述目的,把依賴的控制權(quán)從代碼的內(nèi)部轉(zhuǎn)移到代碼的外部
2.依賴注入側(cè)重于描述手段,實現(xiàn)如何控制反轉(zhuǎn)
實際上,Angular就是一個IOC容器
2.提供器
為了讓注入器知道需要被注入的對象如何實例化,需要指定提供器
providers:[ProductService]
// 它和下面這個寫法是一樣的
providers:[{ provide: ProductService, useClass: ProductService }]
// 使用useClass屬性具體實例化類
providers:[{ provide: ProductService, useClass: AnotherProductService }]
providers:[{ provide: ProductService, useFactory:() => {...} }]
// 提供器的作用域:
// 1.當(dāng)一個提供器聲明在模塊時,它對所有組件可見,所有組件都可以注入該提供器(product1Component組件用的就是這個)
// 2.當(dāng)一個提供器聲明在組件中時,它對當(dāng)前組件及其子組件可見,其他組件不可以注入。
// 3.當(dāng)聲明在模塊的提供器和聲明在組件的提供器具有相同的token時,聲明在組件中的提供器會覆蓋聲明在模塊中發(fā)的提供器。
// 4.一般情況下,優(yōu)先將服務(wù)提供器聲明在模塊中,只有某個服務(wù)提供器必須對某個組件可用且其他組件不可用時,將其聲明在組件中。
3.工廠方法
根據(jù)某些條件,決定實例化哪些對象;實例化對象時,調(diào)用對象的構(gòu)造函數(shù),需要傳遞參數(shù),這個時候使用工廠提供器
useFactory 工廠提供器