10、控制反转Ioc 与DI

128 阅读1分钟

1、什么是Ioc

在NestJS中,IoC(Inversion of Control)是指控制反转,意味着控制权由框架负责管理,而不是由开发者直接控制。IoC容器负责创建和管理应用程序中的组件,例如服务、控制器等。通过依赖注入,容器可以将一个组件所需的依赖项自动注入到它的构造函数中。这样做有助于降低组件之间的耦合度,提高代码的可维护性和可测试性

  1. 装饰器:通过装饰器(例如 @Injectable()@Controller() 等),NestJS 能够识别哪些类是组件,并将它们注册到 IoC 容器中。
  2. 依赖注入:NestJS 使用依赖注入机制,将一个组件所需的依赖项注入到它的构造函数中。这样,你就可以在组件内部直接访问这些依赖项,而不需要手动创建它们。
  3. 作用域管理:IoC 容器管理组件的作用域,可以是单例(singleton)、每次请求(request-scoped)或者自定义作用域。
  4. 解析依赖项:当一个组件需要访问其他组件时,IoC 容器会负责解析这些依赖项并注入到组件中。

2、示例

class Wheel {
  constructor(brand) {
    this.brand = brand;
  }
}

class Car {
  constructor() {
    this.wheel = new Wheel('米其林');
  }

  run() {
    console.log(`汽车用 [${this.wheel.brand}] 牌轮子跑`);
  }
}

new Car().run();
  1. 这个例子中只在车创建时就默认使用了米其林轮胎,但是有的车想用别的轮胎就得重新写一段代码,耦合度较高,

    class Wheel { constructor(brand) { this.brand = brand } }

    class Container { constructor() { this.modules = {} } provide(key,object){ this.modules[key] = object } get(key) { return this.modules[key] } }

    class Car{ constructor(container){ this.wheel = container.get('wheel') } run() { console.log(汽车用 [${this.wheel.brand}] 牌轮子跑); } }

    const container = new Container() container.provide('wheel',new Wheel('米其林')) new Car(container).run()

  2. 以上这个例子就是使用了Ioc思想进行解耦,每次创建Car对象时手动创建轮胎对象,这样每个Car可以拥有不同Wheel