如何使用NestJS创建充当单例的服务 [英] How to create a Service that acts as a singleton with NestJS

查看:29
本文介绍了如何使用NestJS创建充当单例的服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建验证单例服务的模块。想象一下QueueService,最简单的实现是单例服务。

可复制存储库:https://github.com/colthreepv/nestjs-singletons

代码墙

app.module e.ts:

@Module({ imports: [FirstConsumerModule, SecondConsumerModule] })
export class AppModule {}

firstconsumer.module e.tsSecond Consumer er.module e.ts(相同):

@Injectable()
class FirstConsumer {
  constructor(private readonly dependency: DependencyService) {}
}

@Module({
  imports: [DependencyServiceModule],
  providers: [DependencyService, FirstConsumer]
})
export class FirstConsumerModule {
  constructor(private readonly first: FirstConsumer) {}
}

Dependency.module e.ts:

@Injectable()
export class DependencyService {
  constructor() { console.log("Instance created") }
}

@Module({ providers: [DependencyService], exports: [DependencyService] })
export class DependencyServiceModule {}

代码完成

我想要的是让console.logInstance created只发布一次。
目前:

[NestFactory] Starting Nest application...
Instance created
Instance created
Instance created
[InstanceLoader] AppModule dependencies initialized +16ms
[InstanceLoader] DependencyServiceModule dependencies initialized +1ms
[InstanceLoader] FirstConsumerModule dependencies initialized +1ms
[InstanceLoader] SecondConsumerModule dependencies initialized +1ms
[NestApplication] Nest application successfully started +8ms

NestJS中的

推荐答案

模块是单例的,只要它们是由同一模块提供的,它们的提供程序就是单例。在您的示例代码中,您的DependencyService包含在三个不同模块的三个不同的providers数组中。相反,应该做的是仅将其放在DependencyServiceModuleexports数组的providers数组中。然后,您只需要在FrstConsumerModuleSecondConsumerModuledo notimports数组中包含DependencyServiceModule,并将DependencyService添加到其中任何一个的providers数组中。由于位于exports数组中,提供程序已可用于模块上下文。

@Module({
  providers: [DependencyService],
  exports: [DependencyService]
})
export class DependencyServiceModule {}
@Module({
  imports: [DependencyServiceModule],
  providers: [FirstConsumer] // notice no DependencyService class
})
export class FirstConsumerModule {}
@Module({
  imports: [DependnecyServiceModule, FirstCosnumerModule]
})
export class AppModule {}

使用上述内容,您将只看到一个"实例已创建"日志,而不是两个。

这篇关于如何使用NestJS创建充当单例的服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆