Nest基本概念 - 依赖注入与控制反转

7/14/2023 NodejsNestjs

在本章中,我们将学习 NestJS 中的依赖注入(DI)和控制反转(IoC)的概念。DI 和 IoC 是设计模式的一种,用于实现松耦合、可测试和可维护的代码。NestJS 通过使用 DI 和 IoC 提供了一个高度可扩展和可测试的应用程序架构。

# 6.1 什么是依赖注入和控制反转?

依赖注入(Dependency Injection,简称DI)是一种设计模式,它通过将依赖对象的创建和管理责任从类本身移交给外部系统,从而实现了松耦合。在 DI 中,类不需要直接实例化它所依赖的对象,而是由外部系统将依赖的对象传递给类。这样,我们可以轻松地更改或替换类的依赖,而不影响其余部分的代码。

控制反转(Inversion of Control,简称IoC)是 DI 的一种实现方式。在 IoC 中,类不再自己控制依赖的创建和生命周期,而是由 IoC 容器或框架负责管理依赖的创建和注入。这样,类只需要关注自己的业务逻辑,而不需要关心依赖对象的创建和管理。

# 6.2 NestJS 中的依赖注入

NestJS 提供了内置的依赖注入容器,它可以自动管理应用程序中的依赖关系。在 NestJS 中,我们可以使用装饰器 @Injectable() 来将类标记为可注入的服务。

例如,我们创建一个名为 CatsService 的服务,并使用 @Injectable() 装饰器将其标记为可注入的:

import { Injectable } from '@nestjs/common';

@Injectable()
export class CatsService {
  // 服务的逻辑代码
}
1
2
3
4
5
6

# 6.3 注入依赖

在 NestJS 中,我们可以在构造函数中注入依赖,这样 NestJS 会自动创建和注入依赖对象。

例如,在 CatsService 中注入 Cat 实体的数据库仓库 CatsRepository:

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { CatsRepository } from './cats.repository';
import { Cat } from './cat.entity';

@Injectable()
export class CatsService {
  constructor(
    @InjectRepository(CatsRepository)
    private catsRepository: CatsRepository,
  ) {
    // 服务的逻辑代码
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

在上面的代码中,我们使用 @InjectRepository() 装饰器来注入 CatsRepository 作为 catsRepository 成员变量。NestJS 会自动创建 CatsRepository 并将其注入到 catsRepository。

# 6.4 提供者

在 NestJS 中,提供者是指可以通过依赖注入方式注入到其他类中的类。提供者可以是服务、数据库仓库、工厂等。

NestJS 提供了多种方式来定义提供者:

使用 @Injectable() 装饰器将类标记为可注入的服务。

使用 @Module() 装饰器的 providers 属性将类定义为模块的提供者。

例如,在 CatsModule 中定义 CatsService 和 CatsRepository 作为提供者:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
import { Cat } from './cat.entity';
import { CatsRepository } from './cats.repository';

@Module({
  imports: [TypeOrmModule.forFeature([Cat])],
  controllers: [CatsController],
  providers: [CatsService, CatsRepository],
})
export class CatsModule {}
1
2
3
4
5
6
7
8
9
10
11
12
13

在上面的代码中,我们使用 @Module() 装饰器的 providers 属性将 CatsService 和 CatsRepository 定义为 CatsModule 的提供者。这样,CatsService 和 CatsRepository 就可以在整个 CatsModule 中进行依赖注入。

# 6.5 控制反转和依赖注入的优势

使用控制反转和依赖注入的优势包括:

松耦合:DI 和 IoC 实现了组件之间的松耦合,使得组件可以独立测试和维护。

可测试性:DI 和 IoC 可以帮助我们轻松地使用模拟对象进行单元测试。

可扩展性:通过 DI 和 IoC,我们可以轻松地更改或替换依赖对象,从而实现更好的可扩展性。

易于维护:DI 和 IoC 提高了代码的可读性和可维护性,使代码更易于理解和修改。

# 总结

在本章中,我们学习了 NestJS 中的依赖注入和控制反转的概念。依赖注入和控制反转是设计模式的一种,通过将依赖对象的创建和管理责任从类本身移交给外部系统,实现了松耦合、可测试和可维护的代码。NestJS 提供了内置的依赖注入容器,我们可以使用 @Injectable() 装饰器将类标记为可注入的服务,并在构造函数中注入依赖。通过使用控制反转和依赖注入,我们可以实现更高度可扩展和可测试的应用程序架构

编辑时间: 7/14/2023, 10:00:00 AM