第四章 Nest provider


实现我们先创建一个nest 项目

nest new provider

在这里插入图片描述

1、provider的基础用法解释

首先我们打开一下项目下的文件(app.service.ts) 可以看到可以看到 AppService 是被 @Injectable 修饰的 class
1716708573247.png
接着我们打开 app.module.s 可以看到 Module 的 providers 里声明了 AppService,这就是provider 如下图
1716708920516.png
其实 AppService 是一种简写方式 完整的方式如下:
1716709023352.png
provide 指定 token
useClass 指定对象的类,Nest 会自动对它做实例化后用来注入
接着我们看 app.controller.ts 在这个文件里面 AppController 的构造器里参数里声明了 AppService 的依赖,就会自动注入 如下图

在这里插入图片描述


此处有两种注入方式:
构造器注入 也就是上图的

constructor(private readonly appService: AppService) {}

属性注入

@Inject(AppService)
private readonly appService: AppService

1716710328280.png
在 Model中我们还可以注入一些指定值例如

{
    provide: 'test',
    useValue: {
      name: '我是注入的',
    }
  }

使用 provide 指定 token,使用 useValue 指定值
1716712703263.png
接着我们可以在 app.controller.ts 中进行使用
1716712785552.png
接着我们打开 http://localhost:3000/
1716712929637.png
代表注入成功

2、providers 之 useFactory

此外 provider 的值可能是动态产生的 ,我们可以使用 useFactory 来动态创建一个对象,例如下面代码

{
    provide: 'test2',
    useFactory(test: { name: string }, appService: AppService) {
      return {
        name: test.name,
        desc: appService.getHello()
      }
    },
    inject: ['test', AppService]
  }

1716713510786.png
接着在 app.controller.ts 中进行使用
1716713478157.png
界面显示下图则为成功
1716713536653.png
说明provider 还可以调用别的 provider 以及可以调用 service

同时 useFactory 也支持异步

我们将代码改为 Nest 会等拿到异步方法的结果之后再注入

{
    provide: 'test2',
    async useFactory(test: { name: string }, appService: AppService) {

      await new Promise((resolve) => {
        setTimeout(resolve, 2000)
      })

      return {
        name: test.name,
        desc: appService.getHello()
      }
    },
    inject: ['test', AppService]
  }],
})

2、providers 之 useExisting

useExisting 是用来起别名的

将test3 改为test4
1716714271916.png
provider 是通过 @Injectable 声明,然后在 @Module 的 providers 数组里注册的 class。
默认的 provider 就是class 这样不用使用 @Inject 来指定注入的 token
但也可以用字符串类型的 token,不过注入的时候要用 @Inject 单独指定。
除了可以用 useClass 指定注入的 class,还可以用 useValue 直接指定注入的对象。
如果想动态生成对象,可以使用 useFactory,它的参数也注入 IOC 容器中的对象,然后动态返回 provider 的对象。
如果想起别名,可以用 useExisting 给已有的 token,指定一个新 token。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫ゞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值