Nest:依赖注入与多种 provider 提供者(六)

Nest 实现了 IOC 容器,会从入口模块开始扫描,分析 Module 之间的引用关系,对象之间的依赖关系,自动把 provider 注入到目标对象。

类提供者

最常用的形式,使用类本身作为提供者

这个类通常会有 @Injectable() 装饰器,表明它可以被注入:


使用 useClass 的 Provider

当你想要注入一个类,但是使用不同于通常实例化的类时,可以使用 useClass。

typescript 复制代码
class MyService {
// ...
}

class MyMockService {
// ...
}

@Module({
providers: [
{
provide: MyService,
useClass: process.env.NODE_ENV === 'development' ? MyMockService : MyService,
},
],
})
export class MyModule {}
typescript 复制代码
import { Injectable } from '@nestjs/common';

@Injectable()
class SomeService {
constructor(private myService: MyService) {}

someMethod() {
// 使用 this.myService 调用 MyService 或 MyMockService 的方法
}
}

其实之前写的 providers: [appService] 是一种简写,完整写法:

通过 provide 指定注入的 token,通过 useClass 指定注入的对象的类。

Nest 会自动将其实例化注入:

如果不想用构造器注入,也可以属性注入:

通过 @Inject 指定注入的 provider 的 token 即可。

这个 token 也可以是字符串:

值提供者

除了指定 class 外,还可以直接指定一个值,让 IOC 容器来注入。

工厂提供者

provider 的值可能是动态产生的,Nest 支持使用 useFactory 来动态创建一个对象:

useFactory 也是支持参数的注入的。

我们在 useFactory 通过 inject 声明了两个 token,一个是字符串 token 的 person,一个是 class token 的 AppService。

在调用 useFactory 方法的时候,Nest 就会注入这两个对象:

useFactory 还支持异步:

这样 Nest 就会等拿到异步方法的结果之后再注入,更灵活。

别名提供者

provider 还可以通过 useExisting 来指定别名:

这里给 asyncPerson 的 provider 起个新的 token 叫做 newPerson。

相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁2 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95272 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大2 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师2 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学2 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端