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