nest——使用Provider灵活注入对象

54 阅读2分钟

1. 什么是provider

一般来说provider就是使用@Injectable装饰器处理的class,如项目中的service模块: image.png

2. 如何在Module中的providers声明provider

  • 简写方式:
    image.png

  • 完整写法:这种写法是通过provide指定注入的token,通过useClass指定注入对象的类,Nest会自动对其实例化后进行注入。 image.png

  • 使用字符串来代替provide注入的tokenimage.png 这种token是字符串的情况下,注入的时候则需要使用@Inject来手动指定注入对象的token,如: image.png 通过@Inject指定注入providertoken即可,但相比之下用class来做token可以省去@Inject,更方便写一些

  • 指定固定的值,使用IOC容器来注入 image.png 使用字符串的形式,将固定的信息{name: '楚泽', value: 18}注入到程序中。
    然后我们在Controller中换一种方式来注入,之前一直使用构造器注入,这次使用属性注入,如下: image.png 然后我们启动服务,在默认页面路由中刷新,查看调试控制台中的日志打印: image.png image.png 通过终端信息打印可以看到在Providers中定义的信息被成功注入到程序中

  • 使用useFactory动态注入provider的值
    使用useFactory来动态创建一个对象: image.png 然后在controller中注入,并刷新页面后查看控制台 image.png 可以看到动态生成的属性也被成功注入,且可以正常调用

  • 使用useFactory参数注入 image.png 通过inject声明两个token,一个是字符串token'person',一个是class tokenAppService
    这里使用class token有个前提是该class必须被提前注入。
    然后在controller中我们注入并打印该provider,刷新页面: image.png

  • 使用useFactory异步 image.png image.png

  • 使用useExisting别名指定 image.png 这里是指给persontoken起一个名字叫person3

总结:

  • 一般情况下,provider是通过@Injectable声明,然后在@Module的数组里注册的class
  • 默认token就是class,这样不用使用@Inject来张自定注入的token
  • 也可以使用字符串类型的token,这样不用使用@Inject来指定注入的token
  • 除了可以用useClass指定注入的class,还可以用useValue直接指定注入的对象。
  • 可以使用useFactory动态生成对象,它的参数也注入IOC容器中的对象,然后动态返回provider对象。
  • 可以使用useExisting给已经存在的token指定一个新的token

备注

这是我学习用来自己再实现一次刷熟练度的地方,原文是光神写的小册《Nest通关秘籍》