Nestjs全局pubsub实例和依赖注入

bak*_*aku 6 dependency-injection publish-subscribe nestjs

我遵循了有关 pubsub/subsciprtions 的 Nestjs DOCS:

根据示例, pubsub 在给定解析器的顶部初始化为:

const pubSub = new PubSub();
Run Code Online (Sandbox Code Playgroud)

后来文档说:

“我们在这里使用了本地 PubSub 实例。相反,我们应该将 PubSub 定义为提供者,通过构造函数注入它(使用 @Inject() 装饰器),并在整个应用程序中重用它”

{
  provide: 'PUB_SUB',
  useValue: new PubSub(),
}
Run Code Online (Sandbox Code Playgroud)

但这会去哪里呢?
即如何在我的主 app.module 中提供此功能以便它在所有其他模块中可用的语法/方法是什么?

如果我尝试将其作为不同模块中的依赖项提供,我会遇到依赖项解析问题。应用程序模块

  providers: [
    AppService,
    {
      provide: APP_FILTER,
      useClass: AllExceptionsFilter,
    },
    {
      provide: 'PUB_SUB',
      useValue: new PubSub(),
    },
Run Code Online (Sandbox Code Playgroud)

一些解析器.js

  constructor(
    @Inject('PUB_SUB')
    private pubSub: PubSub,
Run Code Online (Sandbox Code Playgroud)

给出: Nest 无法解析 MyResolver 的依赖项( MyResolver 由 MyModule 提供

我无法将 appmodule 导入 MyModule,否则我将创建循环依赖。

我是否定义一个仅提供 pub_sub 实例的新模块?

Jay*_*iel 12

如果您正在寻找它可以轻松地供所有其他模块使用,我建议创建一个PubSubModule为您提供PubSub模块并导出它(如果您想必须导入该模块),或者只是将模块标记为以便@Global()PubSub 可以注射到任何地方

出口方式

@Module({
  providers: [
    {
      provide: 'PUB_SUB',
      useClass: PubSub,
      // useValue: new PubSub(),
      // useFactory: () => {
      //  return new PubSub();
      // }
    }
  ],
  exports: ['PUB_SUB'],
})
export class PubSubModule {}
Run Code Online (Sandbox Code Playgroud)

全局方法

@Global()
@Module({
  providers: [
    {
      provide: 'PUB_SUB',
      useClass: PubSub,
      // useValue: new PubSub(),
      // useFactory: () => {
      //  return new PubSub();
      // }
    }
  ],
})
export class PubSubModule {}
Run Code Online (Sandbox Code Playgroud)