Nest.js 学习笔记 =_= Providers 基础概念

92 阅读1分钟

Providers 含义

Providers 是 Nest 中的基础概念,用服务这个名字描述起来可能更自然。下文皆用带有样式的服务来代指 Providers

服务的核心思想是它可以被当成依赖注入到其他模块或组件中,而连接各个服务的工作将交由 Nest 运行时来完成。

从代码本质上看,服务就是在一个 Moduleproviders 配置项中指定的各种值,可以是一个类、一个常量或者一个函数。服务依托于 Module,需要在 Module 中导入后再导出,才能让其他 Module 使用,或者直接作为主 Module服务

代码示例

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

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

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

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

这里的 CatsService 是一个简单的 class,由于附有 @Injectable() 装饰器,CatsService 可由 Nest IoC 系统来管理。在绑定 Controller 和 服务Moduleproviders 配置中如果包含了 CatsService,则这个类就成为了 Nest 中的 服务

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

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class AppModule {}

在同个 Module中绑定的 Controller 内,可以在构造函数中获取到需要的服务

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 catsService: CatsService) {}

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

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