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通关秘籍》