nestjs - Nestjs在forRootAsync中包装外部模块并注入实例
问题描述
我一直在开发一个nestjs
基于模块的包装器nodejs
模块。我创建了一个静态forRoot
方法来获取配置。我在方法中创建了这样一个prodiver forRoot
:
const MyProvider = {
provide: PROVIDER_TOKEN,
useValue: new MyClass(options),
};
我也导出它,所以在消费者模块中很容易注入它以访问 nodejs 模块的所有方法。此外,我能够将该模块的所有方法包装到我的服务方法中。所以,下面的代码让我可以访问主模块的实例:
constructor(@Inject(PROVIDER_TOKEN) private readonly myClass: MyClass) {}
然后我决定创建一个forRootAsync
可以处理获取配置的方法useFactory
。现在这是我的forRootAsync
方法提供者:
const MyProvider= {
provide: PROVIDER_TOKEN,
useFactory: optionsAsync.useFactory,
inject: optionsAsync.inject || []
};
但是这次如果我注入PROVIDER_TOKEN
服务,这只是配置对象(我从消费者模块传递)。所以我想我应该在构造函数中创建实例。也许是这样的:
constructor(@Inject(PROVIDER_TOKEN) private readonly myClass) {
if(!this.myClass typeof MyClass) {
this.myClass = new MyClass(this.myClass);
}
}
这样,我无法通过注入PROVIDER_TOKEN
令牌来访问消费者模块中主模块的实例。目标是访问该模块的所有方法,而不必包装所有方法。任何的想法?
解决方案
我们应该与两个提供者一起处理这个问题。在第一个中,我们通过工厂提供者如下:
{
provide: HTTP_MODULE_OPTIONS,
useFactory: options.useFactory,
inject: options.inject || [],
};
然后我们创建另一个提供者,它注入第一个提供者(nestjs 在那个时候解决依赖关系):
{
provide: AXIOS_INSTANCE_TOKEN,
useFactory: (config: HttpModuleOptions) => Axios.create(config),
inject: [HTTP_MODULE_OPTIONS],
},
这是示例。
推荐阅读
- optimization - 使用 IBM cplex feasopt python 的接口获取不可行性
- c++ - 如何判断cout和cerr是否去同一个地方
- firebase - 需要权限时如何从 FirebaseStorage 加载多个图像?
- woocommerce - 将客户添加为 woocommerce 订阅取消订阅电子邮件的收件人(通知)
- azure - 添加动态内容 - Azure 数据工厂 ADF V2
- java - Spring Boot 的 Elasticsearch Searchguard 配置
- java - 无法在 Spring Boot 应用程序中解析符号“安全”
- mysql - 记录 SQL 查询
- loops - 循环遍历嵌套的 SASS 映射以创建类
- ios - 在所选类型的标签栏项目上设置徽章(不知道其索引)