1. 概念篇

1.1 IOC

Ioc的全称是 Inversion of Control 即为 控制反转。 在开发中 Ioc意味着你设计好的对象交给容器控制 而不是使用传统的方式 在对象内部直接控制

在不使用IoC的情况下 我们很容易写出这样的代码

  1. import { A } from './modA'
  2. import { B } from './modB'
  3. class C {
  4. constrcutor() {
  5. this.a = new A()
  6. this.b = new B()
  7. }
  8. }

乍一看可能没什么 但是实际上C会强依赖于A,B 造成模块之间的耦合,要解决这个问题,我们可以这么做 用一个第三方的容器来负责管理容器,当我们需要某个实例时,由这个容器来替我们实例化并交给我们实例

以 Injection 为例

  1. import { Container } from 'injection'
  2. import { A } from './A'
  3. import { B } from './B'
  4. const container = new Container()
  5. container.bind(A)
  6. container.bind(B)
  7. class C {
  8. constructor() {
  9. this.a = container.get('a');
  10. this.b = container.get('b');
  11. }
  12. }

现在A、B、C之间没有了耦合,甚至当某个类D需要使用C的实例时,我们也可以把C交给IoC容器。
我们现在能够知道IoC容器大概的作用了:容器内部维护着一个对象池,管理着各个对象实例,当用户需要使用实例时,容器会自动将对象实例化交给用户。
再举个栗子,当我们想要处对象时,会上Soul、Summer、陌陌…等等去一个个找,找哪种的与怎么找是由我自己决定的,这叫 控制正转。现在我觉得有点麻烦,直接把自己的介绍上传到世纪佳缘,如果有人看上我了,就会主动向我发起聊天,这叫 控制反转

1.2 DI

DI的全称是 Dependency Injection 即 依赖注入。 依赖注入是 控制反转中最常见的一种应用方式, 就如它的名字一样,它的思路就是在对象创建时自动注入依赖对象 再以 Injection 的使用为例

  1. // provide 意为当前对象需要被绑定到容器中
  2. // inject 意为 去容器中取出对应的实例注入到当前属性中
  3. @provide()
  4. export class UserService {
  5. @inject()
  6. userModel;
  7. async getUser(userId) {
  8. return await this.userModel.get(userId);
  9. }
  10. }

我们不需要在构造函数中去手动this.userModel = xxx了,容器会自动帮我们做这一步。