依赖注入
依赖注入:Dependency Injection 简称DI
首先,当使用参数是对象的方法时,需要先实例化对象,再传给方法。
var person = new Person();
addPerson(person);
于是我们说,addPerson方法依赖Person类,而Person类注入给addPerson方法。
然而,当addPerson需要多个参数时,则有
//实例化对象start
var person = new Person();
var sex = new Sex();
var adress = new Adress();
var order = new Order();
order.setAdress(adress);
//实例化对象end
addPerson(person,sex,order);
DI解决了实例化对象这个冗长的步骤,在依赖注入中,
控制反转
控制反转:Inversion of Control 简称IOC
控制反转是指将依赖的控制权从代码内部移交到代码外部,实现控制反转模式的框架叫做IOC容器,Angular是IOC容器的。
依赖注入和控制反转的关系:
依赖注入和控制反转是一体两面的概念,控制反转是目的,而依赖注入是手段,Angular就是使用了“依赖注入”手段,实现了控制反转的目的。
var person = new Person();
addPerson(Person);
//如果把addPerson方法中的参数Person改成MockPerson,则需要改变内部代码new的过程
var product = new MockPerson();
addPerson(product );
而,依赖注入只需声明,我需要一个person参数,至于这个参数是来源于Person类还是MockPerson类,与我无关,只需交付给外部代码操作。
使用依赖注入步骤
松耦性,可重用性和可测试性高
@NgModule({
providers:[ProductService]
//等价于
//providers:[{provide:ProductService,useClass:ProductService}]
})
export class AppModule { }
@Component({
...省略组件配置
})
export class ProductComponent{
product:Product;
constructor(productService:ProductService){
this.product = productService.getProduct();
}
}
而当需要更改服务为AnotherProductService时,只需更改providers中的声明,消除了ProductComponent和ProductService的耦合性。
@NgModule({
providers:[{provide:ProductService,useClass:AnotherProductService}]
})
export class AppModule { }