Providers 含义
Providers 是 Nest 中的基础概念,用服务这个名字描述起来可能更自然。下文皆用带有样式的服务来代指 Providers。
服务的核心思想是它可以被当成依赖注入到其他模块或组件中,而连接各个服务的工作将交由 Nest 运行时来完成。
从代码本质上看,服务就是在一个 Module 的 providers 配置项中指定的各种值,可以是一个类、一个常量或者一个函数。服务依托于 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 和 服务 的 Module 的 providers 配置中如果包含了 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();
}
}