【发布时间】:2021-07-30 06:41:53
【问题描述】:
我遇到了一个问题,我的常用库注射剂被彼此覆盖
引导文件与代理服务器一起运行此文件以初始化本地微服务
import { serviceA } from '@company/serviceA'
import { serviceB } from '@company/serviceB'
import { serviceC } from '@company/serviceC'
import { Worker } from 'worker_threads'
import path from 'path'
enum Services {
serviceA = 'serviceA',
serviceB = 'serviceB',
serviceC = 'serviceC'
}
interface WorkerData {
service: Services
}
export class ServiceStarter {
private readonly filePath = path.join(__dirname, '..', 'dist', 'bootstrap.js')
constructor(private readonly isMainThread: boolean, private readonly workerData: WorkerData) { }
async startAllServices(): Promise<void> {
try {
if (this.isMainThread) {
new Worker(this.filePath, { workerData: { service: Services.serviceA } });
new Worker(this.filePath, { workerData: { service: Services.serviceB } });
new Worker(this.filePath, { workerData: { service: Services.serviceC } });
} else {
await this.childService(this.workerData)
}
} catch (error) {
console.log(JSON.stringify(error, null, 2))
}
}
async childService({ service }: WorkerData) {
console.log(`Starting Service - ${service}`)
switch (service) {
case Services.serviceA:
return await serviceB()
case Services.serviceB:
return await serviceA()
case Services.serviceC:
return await serviceC()
default:
throw new Error('Service Unavailable');
}
}
}
在构造函数中有一个包含大量可注入的通用文件夹,并且不同的类在 .module 文件夹中声明的不同服务中有它们的实现
实施 1
@Module({
imports: [CommonModule],
providers: [
...commonProviders,
{
provide: CARD_PROVIDER_FACADE_FACTORY,
useClass: serviceAFactory,
},
实现 2
@Module({
imports: [CommonModule],
providers: [
...commonProviders,
{
provide: CARD_PROVIDER_FACADE_FACTORY,
useClass: serviceBFactory,
},
我出现的问题是首先初始化的内容会覆盖提供程序,因此如果 serviceBFactory 先初始化,那么它将服务 B 注入应该注入 serviceAFactory 的其他微服务
TLDR:当我们的门面调用 serviceA 时,如果 serviceB 最后初始化,则 serviceB 的工厂被注入。我假设通过在他们自己的线程中定义每个范围将分离范围。我在这里想念什么?他们是干净的解决方案吗?
对不起,如果这是一个有点令人费解的第一个堆栈溢出问题
编辑:作为我认为解决问题的更新。我使用 await import('') 语法懒惰地导入了每个文件。因此,只有工作人员可以访问他自己的导入服务。
【问题讨论】:
标签: node.js typescript nestjs