【问题标题】:nestjs global pubsub instance and dependency injectionnestjs 全局 pubsub 实例和依赖注入
【发布时间】:2020-03-25 00:43:06
【问题描述】:

我关注了有关 pubsub/subsciprtions 的 Nestjs DOCS:

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

const pubSub = new PubSub();

后来文档说:

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

{
  provide: 'PUB_SUB',
  useValue: new PubSub(),
}

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

如果我尝试在不同的模块中将此作为依赖项提供,我会遇到依赖项解析问题。 app.module

  providers: [
    AppService,
    {
      provide: APP_FILTER,
      useClass: AllExceptionsFilter,
    },
    {
      provide: 'PUB_SUB',
      useValue: new PubSub(),
    },

some-resolver.js

  constructor(
    @Inject('PUB_SUB')
    private pubSub: PubSub,

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

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

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

【问题讨论】:

    标签: dependency-injection publish-subscribe nestjs


    【解决方案1】:

    如果您希望它可以轻松地用于所有其他模块,我建议创建一个 PubSubModule 来提供您的 PubSub 并在您想要导入模块时导出它,或者只是标记为@Global()的模块,因此可以在任何地方注入PubSub

    导出方法

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

    全局方法

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

    【讨论】:

    • 非常感谢,这确实是我登陆的地方。使用全局装饰器有什么缺点?在 appmodule 中完成的其他模块实例化,如 typeorm、graphql 等似乎不遵循这种模式。再次在文档中,nest 团队没有提到将其用于自定义记录器。在主 app.module 中配置后,某些功能如何“神奇地”可用仍然很模糊。到目前为止,这是我使用“全局”装饰器的唯一实例
    • 我真的没有看到它的缺点,除了像你说的那样,它“神奇地”可用。实际上,我最近与一位贡献者合作,想出一种使用 Global 的方法,但仍然只使用一次配置。我不喜欢使用@global(),只是因为它让我思考在当前范围内真正可用的东西
    猜你喜欢
    • 2019-05-06
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2021-04-06
    • 2022-11-17
    相关资源
    最近更新 更多