实现我们先创建一个nest 项目
nest new provider
1、provider的基础用法解释
首先我们打开一下项目下的文件(app.service.ts) 可以看到可以看到 AppService 是被 @Injectable 修饰的 class
接着我们打开 app.module.s 可以看到 Module 的 providers 里声明了 AppService,这就是provider 如下图
其实 AppService 是一种简写方式 完整的方式如下:
provide 指定 token
useClass 指定对象的类,Nest 会自动对它做实例化后用来注入
接着我们看 app.controller.ts 在这个文件里面 AppController 的构造器里参数里声明了 AppService 的依赖,就会自动注入 如下图
此处有两种注入方式:
构造器注入 也就是上图的
constructor(private readonly appService: AppService) {}
属性注入
@Inject(AppService)
private readonly appService: AppService
在 Model中我们还可以注入一些指定值例如
{
provide: 'test',
useValue: {
name: '我是注入的',
}
}
使用 provide 指定 token,使用 useValue 指定值
接着我们可以在 app.controller.ts 中进行使用
接着我们打开 http://localhost:3000/
代表注入成功
2、providers 之 useFactory
此外 provider 的值可能是动态产生的 ,我们可以使用 useFactory 来动态创建一个对象,例如下面代码
{
provide: 'test2',
useFactory(test: { name: string }, appService: AppService) {
return {
name: test.name,
desc: appService.getHello()
}
},
inject: ['test', AppService]
}
接着在 app.controller.ts 中进行使用
界面显示下图则为成功
说明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
provider 是通过 @Injectable 声明,然后在 @Module 的 providers 数组里注册的 class。
默认的 provider 就是class 这样不用使用 @Inject 来指定注入的 token
但也可以用字符串类型的 token,不过注入的时候要用 @Inject 单独指定。
除了可以用 useClass 指定注入的 class,还可以用 useValue 直接指定注入的对象。
如果想动态生成对象,可以使用 useFactory,它的参数也注入 IOC 容器中的对象,然后动态返回 provider 的对象。
如果想起别名,可以用 useExisting 给已有的 token,指定一个新 token。