1. 什么是provider
?
一般来说provider
就是使用@Injectable
装饰器处理的class
,如项目中的service
模块:
2. 如何在Module
中的providers
声明provider
-
简写方式:
-
完整写法:这种写法是通过
provide
指定注入的token
,通过useClass指定注入对象的类,Nest会自动对其实例化后进行注入。 -
使用字符串来代替
provide
注入的token
:这种
token
是字符串的情况下,注入的时候则需要使用@Inject
来手动指定注入对象的token
,如:通过
@Inject
指定注入provider
的token
即可,但相比之下用class来做token可以省去@Inject,更方便写一些 -
指定固定的值
,使用IOC容器来注入使用字符串的形式,将固定的信息
{name: '楚泽', value: 18}
注入到程序中。
然后我们在Controller
中换一种方式来注入,之前一直使用构造器注入
,这次使用属性注入
,如下:然后我们启动服务,在默认页面路由中刷新,查看调试控制台中的日志打印:
通过终端信息打印可以看到在
Providers
中定义的信息被成功注入到程序中 -
使用
useFactory
动态注入provider
的值
使用useFactory
来动态创建一个对象:然后在controller中注入,并刷新页面后查看控制台
可以看到动态生成的属性也被成功注入,且可以正常调用
-
使用
useFactory
参数注入通过
inject
声明两个token
,一个是字符串token
的'person'
,一个是class token
的AppService
。
这里使用class token
有个前提是该class
必须被提前注入。
然后在controller中我们注入并打印该provider,刷新页面: -
使用
useFactory
异步 -
使用
useExisting
别名指定这里是指给
person
的token
起一个名字叫person3
总结:
- 一般情况下,
provider
是通过@Injectable
声明,然后在@Module
的数组里注册的class
。 - 默认
token
就是class
,这样不用使用@Inject
来张自定注入的token
。 - 也可以使用字符串类型的
token
,这样不用使用@Inject
来指定注入的token
。 - 除了可以用
useClass
指定注入的class
,还可以用useValue
直接指定注入的对象。 - 可以使用
useFactory
动态生成对象,它的参数也注入IOC
容器中的对象,然后动态返回provider
对象。 - 可以使用
useExisting
给已经存在的token
指定一个新的token
。
备注
这是我学习用来自己再实现一次刷熟练度的地方,原文是光神写的小册《Nest通关秘籍》