Angular算是将后端开发工程化引入前端的先驱之一,而Dependency injection依赖注入(后面简称为DI)又是Angular内部运作的核心功能,所以要深入理解Angular有必要先理解这一核心概念。
维基百科对依赖注入的解释?
在软件工程中,依赖注入是实现控制反转的一种软件设计模式,一个依赖是一个被其他对象(client)调用的对象(服务),注入则是将被依赖的对象(service)实例传递给依赖对象(client)的行为。将 被依赖的对象传给依赖者,而不需要依赖者自己去创建或查找所需对象是DI的基本原则。 依赖注入允许程序设计遵从依赖倒置原则(简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合) 调用者(client)只需知道服务的接口,具体服务的查找和创建由注入者(injector)负责处理并提供给client,这样就分离了服务和调用者的依赖,符合低耦合的程序设计原则。
依赖注入中的角色?
从维基百科解释可知, DI中包含三个角色,调用者(client), 服务(service)和注入者 (injector),下面开始介绍本文的主题 Angular的依赖注入。
为什么要使用依赖注入❓
我们用官网的一个小例子了解一下?
export class Car {
public engine: Engine;
public tires: Tires;
public description = 'No DI';
constructor() {
this.engine = new Engine();
this.tires = new Tires();
}
// Method using the engine and tires
drive() {
return `${this.description} car with ` +
`${this.engine.cylinders} cylinders and ${this.tires.make} tires.`;
}
}
我们可以看到一个Car类依赖于Engine和Tires这两个类,我们在Car的构造函数中去实例这两个依赖类。这有什么问题?如果有一天我们的Tires构造函数需要一个参数,那么我们必须要在Car的构造函数中去更改代码。
constructor() {
this.engine = new Engine();
this.tires = new Tires(params);
}
]
这种代码是非常不灵活的。虽然我们可以进行如下结构调整
export class Car {
public engine: Engine;
public tires: Tires;
public description = 'No DI';
constructor(engine, tires) {
this.engine = engine;
this.tires = tires;
}
// Method using the engine and tires
drive() {
return `${this.description} car with ` +
`${this.engine.cylinders} cylinders and ${this.tires.make} tires.`;
}
}
const car = new Car(new Engine(), new Tires())
这样似乎解决了不灵活的问题,但是如果依赖项很多的话,我们都要去手动创建这些实例,也不太方便。其实创建依赖实例的过程完全可以交给一个专门的’工厂’来做,这就是angular里面的Injector。
使用实例请参考:Angular4学习之依赖注入
我有话说?
书读百遍,其意自现。虽然现在还不是很明白,但是实践起来,应该就会懂了。