组件

组件

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

图1

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

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

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

我们来创建一个 CatsService 组件:

cats.service.ts

import { Component } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';

@Component()
export class CatsService {
  private readonly cats: Cat[] = [];

  create(cat: Cat) {
    this.cats.push(cat);
  }

  findAll(): Cat[] {
    return this.cats;
  }
}

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

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

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

cats.controller.ts

import { Controller, Get, Post, Body } from '@nestjs/common';
import { CreateCatDto } from './dto/create-cat.dto';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';

@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @Post()
  async create(@Body() createCatDto: CreateCatDto) {
    this.catsService.create(createCatDto);
  }

  @Get()
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }
}

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

依赖注入

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

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

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

constructor(private readonly catsService: CatsService) {}

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

最后一步

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

app.module.ts

import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';
import { CatsService } from './cats/cats.service';

@Module({
    controllers: [CatsController],
    components: [CatsService],
})
export class ApplicationModule {}

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

-| src/
  -| modules/
    -|cats/
      -| dto/
        -| create-cat.dto.ts
      -| interfaces/
        -| cat.interface.ts
      -| cats.service.ts
      -| cats.controller.ts
    -| app.module.ts
  -|server.ts