gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:43:28 25 4
gpt4 key购买 nike

我正在尝试创建一个提供单例服务的模块。想象一下 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) {}
}

依赖.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

最佳答案

在 NestJS 模块中是单例,只要它们是从同一个模块提供的,它们的提供者就会成为单例。在您的示例代码中,您有 DependencyService在三个不同的providers三个不同模块的数组。而应该做的是仅限 有它在providers DependencyServiceModule 的数组和 exports数组也是。那么你只需要拥有DependencyServiceModuleimports FrstConsumerModule 的数组和 SecondConsumerModule不要添加 DependencyServiceproviders数组。感谢 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 {}

使用上述内容,您只会看到一个“创建实例”的日志,而不是两个。

关于dependency-injection - 如何使用 NestJS 创建充当单例的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60192912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com