NestJS| 02- Provider

194 阅读2分钟

这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战

目录

前言

SAD,一直没空去更新文章。还是要坚持去更新文章,坚持一个固定的输入才能有内容输出,不然总有一天出现知识匮乏的时候,学习的时候可以从以下问题入手去了解一个知识点。

  • Provider是什么?
  • 为什么提供Provider?
  • 提供Provider为了解决什么问题
  • 如何使用Provider

Provider

前面谈及到nestjs中使用了控制反转IOC的模式,以及Controller层、service层、DAO层三层结构和以往的MVC框架不同。其中service层其实就是一个provider,通过使用@Injectable()装饰的类,并在controller层中通过constructor注入以来关系。有很多Nest类都可能被视为provider,如:service、repository、factory、helper等。

constructor(private readonly catsService: CatsService) {}

Provider生命周期

Provider在一般情况下与应用程序的生命周期同步,引导应用程序时,必须解析每个依赖项,因此必须实例化每个Provider。同样,当应用程序关闭时,每个Provider都将被销毁。

注册Provider

通过使用nestjs 提供的cli工具去创建的,这样cli会自动的帮我们把这个Provider注册到module中。

  • 前提先创建module:nest g module order,然后再创建service :nest g service order时,会自动注册到Module。
import { Module } from '@nestjs/common';
import { OrderService } from './order.service';
import { OrderController } from './order.controller';
​
@Module({
  providers: [OrderService],
  controllers: [OrderController],
})
export class OrderModule {}
​

自定义提供者

Nest 支持定义自定义提供程序处理一些无法解决的场景:

  • 您要创建自定义实例,而不是让 Nest 实例化(或返回其缓存实例)类
  • 您想在第二个依赖项中重用现有的类
  • 您想使用模拟版本覆盖类进行测试

解决方案:

  • 值提供者(useValue):useValue 语法对于注入常量值、将外部库放入 Nest 容器或使用模拟对象替换实际实现非常有用
  • 非类提供者
  • 类提供者(useClass):useClass语法允许您动态确定令牌应解析为的类
  • 工厂提供者 (useFactory):useFactory 语法允许动态创建提供程序。实工厂函数的返回实际的 provider

\