Dependency injection nestjs全局pubsub实例和依赖项注入
我遵循了Nestjs关于pubsub/Subcipations的文档: 根据示例,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中提供此功能,使其在所有其他模块中都可用,其语法/方法是
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,