Dependency injection nestjs全局pubsub实例和依赖项注入

Dependency injection nestjs全局pubsub实例和依赖项注入,dependency-injection,publish-subscribe,nestjs,Dependency Injection,Publish Subscribe,Nestjs,我遵循了Nestjs关于pubsub/Subcipations的文档: 根据示例,pubsub在给定解析器的顶部用以下命令初始化: const pubSub = new PubSub(); 后来文件说: “我们在这里使用了一个本地PubSub实例。相反,我们应该将PubSub定义为一个提供程序,通过构造函数注入它(使用@inject()decorator),并在整个应用程序中重用它” 这是怎么回事? 例如,如何在我的主app.module中提供此功能,使其在所有其他模块中都可用,其语法/方法是

我遵循了Nestjs关于pubsub/Subcipations的文档:

根据示例,pubsub在给定解析器的顶部用以下命令初始化:

const pubSub = new PubSub();
后来文件说:

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

这是怎么回事?
例如,如何在我的主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,否则我将创建循环依赖关系


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

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

导出方法
@模块({
供应商:[
{
提供:'酒吧SUB',
使用类别:PubSub,
//useValue:new PubSub(),
//useFactory:()=>{
//返回新的PubSub();
// }
}
],
出口:['PUB_SUB'],
})
导出类PubSubModule{}
全局方法
@Global()
@模块({
供应商:[
{
提供:'酒吧SUB',
使用类别:PubSub,
//useValue:new PubSub(),
//useFactory:()=>{
//返回新的PubSub();
// }
}
],
})
导出类PubSubModule{}

非常感谢,这确实是我登陆的地方。使用全局装饰器的缺点是什么?在appmodule中完成的其他模块实例化,如typeorm、graphql等,似乎并不遵循这种模式。在文档中,nest团队也没有提到将其用于自定义记录器。对于某些功能是如何“神奇”的,仍然不清楚在主app.module中配置后可用。到目前为止,这是我使用“全局”装饰的唯一实例,我没有看到它的缺点,就像你说的,它“神奇地”可用。事实上,我最近与一位贡献者合作,找到了一种使用全局的方法,但仍然只使用了一次配置。我不喜欢使用
@Global()
,因为它让我思考在当前范围内真正可用的东西
  constructor(
    @Inject('PUB_SUB')
    private pubSub: PubSub,