如何使用NestJS创建充当单例的服务

时间:2020-02-12 16:26:33

标签: dependency-injection singleton nestjs

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

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

代码墙

app.module.ts:

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

firstconsumer.module.ts secondconsumer.module.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.ts:

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

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

代码已完成

我想获得的是console.log Instance 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

1 个答案:

答案 0 :(得分:6)

在NestJS模块中,单身人士及其提供者被制成单身人士,只要它们是从同一模块中提供的。在示例代码中,您将DependencyService放在三个不同的providers数组中,用于三个不同的模块。相反,应该将其保存在providersDependencyServiceModule数组的exports数组中。然后,您只需要在DependencyServiceModuleimports的{​​{1}}数组中放置FrstConsumerModule,并且不需要添加SecondConsumerModule到任一的DependencyService数组。由于位于providers数组中,因此提供程序已可用于模块上下文。

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

通过以上内容,您只会看到一个“创建实例”日志,而不是两个。