组件

几乎所有的事物都是一个组件 ServiceRepositoryFactoryHelper,可以通过构造函数将一个组件注入控制器或者另一个组件中。

图1

在上一章中,我们已经构建了一个简单的控制器 CatsController

控制器应该只处理HTTP请求并将更复杂的任务委托给组件。 这些组件是一个普通的 TypeScript 类,带有 @Component() 装饰器。

!> Nest 为了更好的程序设计性,依赖关系组织更加符合面向对象的方式,我们强烈建议程序开发时遵循 SOLID 原则。

我们来创建一个 CatsService 组件:

cats.service.ts

  1. import { Component } from '@nestjs/common';
  2. import { Cat } from './interfaces/cat.interface';
  3. @Component()
  4. export class CatsService {
  5. private readonly cats: Cat[] = [];
  6. create(cat: Cat) {
  7. this.cats.push(cat);
  8. }
  9. findAll(): Cat[] {
  10. return this.cats;
  11. }
  12. }

组件没有什么特别的。这里是一个 CatsService ,一个具有一个属性和两个方法的基本类。 唯一的区别是它有 @Component() 装饰器。 @Component() 附加元数据,因此 Nest 知道这个类是一个 Nest 组件。

!> 这里有个Cat 的接口我没有提到它, 因为结构与我们在上一章中创建的 CreateCatDto 类完全相同。

既然我们已经完成了服务类, 让我们在 CatsController 中使用它:

cats.controller.ts

  1. import { Controller, Get, Post, Body } from '@nestjs/common';
  2. import { CreateCatDto } from './dto/create-cat.dto';
  3. import { CatsService } from './cats.service';
  4. import { Cat } from './interfaces/cat.interface';
  5. @Controller('cats')
  6. export class CatsController {
  7. constructor(private readonly catsService: CatsService) {}
  8. @Post()
  9. async create(@Body() createCatDto: CreateCatDto) {
  10. this.catsService.create(createCatDto);
  11. }
  12. @Get()
  13. async findAll(): Promise<Cat[]> {
  14. return this.catsService.findAll();
  15. }
  16. }

这个 Catsservice 是通过类的构造器注入进来的。不必在意这个 private readonly 简写语法,它代表我们已经在这儿创建和初始化了这个 Catsservice 成员。

依赖注入

Nest 是建立在强大的设计模式之上的,这通常称为依赖注入。 在官方的 Angular 文献中有一篇关于这个概念的好文章

!> 在此处了解更多关于嵌套依赖注入的内容。

使用 TypeScript 管理依赖关系是非常容易的,因为 Nest 只会按类型识别您的依赖关系。 这一行:

  1. constructor(private readonly catsService: CatsService) {}

有一件重要的事情你必须要知道,tsconfig.json 文件中 emitDecoratorMetadata 选项设置为 true

最后一步

最后一件事是告诉模块,一个叫做 CatsService 的东西确实是存在的。 解决这个问题的唯一的方法是打开 app.module.ts 文件,并将服务放入 @Module()装饰器components 数组中。

app.module.ts

  1. import { Module } from '@nestjs/common';
  2. import { CatsController } from './cats/cats.controller';
  3. import { CatsService } from './cats/cats.service';
  4. @Module({
  5. controllers: [CatsController],
  6. components: [CatsService],
  7. })
  8. export class ApplicationModule {}

现在,Nest 将顺利解决 CatsController 类的依赖关系。 这就是我们的目录结构现在的样子:

  1. -| src/
  2. -| modules/
  3. -|cats/
  4. -| dto/
  5. -| create-cat.dto.ts
  6. -| interfaces/
  7. -| cat.interface.ts
  8. -| cats.service.ts
  9. -| cats.controller.ts
  10. -| app.module.ts
  11. -|server.ts