这是我参与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
\