4.1本章簡介
第三章 Angular Route導航 我們學了路由的相關知識影暴,這一章將繼續(xù)開發(fā)在線競拍程序 ,并把精力集中在如何使用angular處理對象的過程腻豌,也就是依賴注入 (Dependency Injection 簡稱DI)家坎。
本章的學習內(nèi)容
- 什么是依賴注入模式及使用依賴注入的好處
- 介紹Angular的依賴注入實現(xiàn):注入器和提供器
- 注入器的層級關系
4.2依賴注入的好處
4.2.1、了解依賴注入的好處之前先要知道依賴注入要解決的問題:
假設你寫了一個方法吝梅,方法的參數(shù)是一個對象虱疏,當你調(diào)用這個方法時,需要實例化這個對象并把它傳遞給方法苏携,假設在線競拍程序有個發(fā)貨中心負責把你買到的商品發(fā)給你做瞪,程序中我們可能會編寫這樣的代碼:
var product = new Product();
createShipment(product);
如果我們調(diào)用的對象需要三個參數(shù),比如發(fā)貨時的商品信息、快遞公司信息装蓬、訂單的信息著拭,每個對象又有自己的依賴(比如訂單信息里面又有地址信息對象),那代碼就可能變成這樣:
var product = new Product();'
var shipCompany = new shipVompany();
var address = new Address();
var order = new Order();
order.setAddress(address);
createShipment(product, shipCompany, order)
這個過程有大量的實例化對象代碼牍帚,能不能找一個某人來替我們創(chuàng)建這些實例化代碼依賴的對象以及對象依賴的對象儡遮,使得我們使用的時候只需要寫最后一句?
如果一個對象A要依賴類型為B的這樣一個對象暗赶,那么對象A不需要明確地去實例化B峦萎,B由外部機制注入進來,對象A只需要聲明我需要一個B類型的對象忆首,有人能給我一個嗎爱榔?
這就是依賴注入模式要解決的問題。
4.2.2糙及、控制反轉
與依賴注入同時出現(xiàn)的另一個概念叫做控制反轉:Inversion of Control 簡稱IOC详幽。控制反轉和依賴注入是一體兩面浸锨,表達的是一個思想唇聘。
控制反轉側重于描述目的:如何將依賴的控制權從代碼的內(nèi)部轉到代碼的外部;
依賴注入側重于描述手段:如何實現(xiàn)控制反轉柱搜。
實現(xiàn)了依賴注入模式的框架被稱為IOC容器迟郎,Angular框架就是一個IOC容器,Angular實現(xiàn)控制反轉的手段就是依賴注入聪蘸。
這里描述了一些概念宪肖,比較難理解,需要一些面向對象的思想健爬,后面可以慢慢的理解控乾。
控制反轉是指將依賴的控制權從代碼的內(nèi)部轉到代碼的外部,比如4.2.1中的代碼對代碼的依賴是由代碼的內(nèi)部所決定的娜遵。
4.2.3蜕衡、使用依賴注入模式的好處
簡單來說依賴注入會幫助你以松耦合的方式來編寫代碼,讓你的代碼可測性和可重用性更高设拟。
@NgModule({
providers: [productService], //1慨仿、在Angular中根據(jù)指定providers來告訴Angular哪些對象需要依賴注入
...省略其他配置
})
export class AppModule{ }
@Component({
...省略其他配置
})
export class ProductComponent{
product: Product;
constructor(productService: ProductService){ //2、聲明自己需要一個類型為ProductService的token
this.product = productService.getProduct();
}
}
providers: [productService]
等價于 providers:[{provcide: ProductService, userClass: ProductService}]
這里涉及Angular的一個概念:token纳胧,一個token代表一個被注入的對象的類型镰吆,token的類型由provider配置對象的provide屬性來決定。所以這段代碼的意思是躲雅,注冊一個類型是ProductService
的token鼎姊,當有組件或指令聲明自己需要一個類型為ProductService
的token時,實例化一個ProductService
并將其注入到對象。
用它的構造函數(shù)聲明自己需要一個類型為ProductService
的token相寇,Angular框架看到構造函數(shù)的聲明后慰于,會在providers里面去找這個類型的token所對應的類,這里寫的是ProductService
唤衫,所以會實例化一個ProductService
到構造函數(shù)賦并值給productService
婆赠,
如果你想在其他項目中重用ProductComponent
組件,而另一個項目中有另一個實現(xiàn)了ProductService
的類佳励,那你可以修改那個項目的AppModule
的providers
聲明休里,修改為:
providers:[{provcide: ProductService, userClass: AnotherProductService}]
這樣ProductComponent本身就不需要做任何更改。也消除了Product和ProductService的緊耦合赃承,提高了ProductComponent組件的重用性妙黍。