提供者

几乎所有的东西都可以被认为是提供者 - service, repository, factory, helper 等等。他们都可以注入依赖关系 constructor,也就是说,他们可以创建各种关系。但事实上,提供者不过是一个用@Injectable() 装饰器注解的简单类。

提供者 - 图1

控制器应处理 HTTP 请求并将更复杂的任务委托给服务。提供者是纯粹的 JavaScript 类,其 @Injectable() 上有装饰器。

?> 由于 Nest 可以以更多的面向对象方式设计和组织依赖性,因此我们强烈建议遵循 SOLID 原则。

我们来创建一个简单的 CatsService 提供者:

cats.service.ts

  1. import { Injectable } from '@nestjs/common';
  2. import { Cat } from './interfaces/cat.interface';
  3. @Injectable()
  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 基本类,有一个属性和两个方法。唯一的新特点是它使用 @Injectable() 装饰器。该 @Injectable() 附加的元数据,从而 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文档中阅读关于这个概念的伟大文章。

在 Nest 中,由于 TypeScript 的缘故,管理依赖关系非常简单,因为它们只是按类型解决,然后注入控制器的构造函数中:

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

定制提供者

Nest 用来解决提供者之间关系的控制反转要比上面描述的要强大得多。@Injectable() 装饰器只是冰山一角, 不需要严格定义提供商。相反,您可以使用普通值,类,异步或同步工厂。看看这里找到更多的例子。

最后一步

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. providers: [CatsService],
  7. })
  8. export class ApplicationModule {}

得益于此,Nest 将能够解决 CatsController 类的依赖关系。这就是我们目前的目录结构:

  1. src
  2. ├── cats
  3. ├──dto
  4. └──create-cat.dto.ts
  5. ├── interfaces
  6. └──cat.interface.ts
  7. ├──cats.service.ts
  8. └──cats.controller.ts
  9. ├──app.module.ts
  10. └──main.ts