【发布时间】:2022-12-20 04:53:29
【问题描述】:
我面临以下问题。我有一个控制器使用的服务。该服务(在 QueueService 下面的 sn-ps 中)注入从包中导入的提供程序。我的目标是跨控制器方法重用 QueueService,但我还需要动态指定应该使用哪个提供者 QueueService。
我的问题是,我怎样才能实现这种行为?
import { PubsubService } from '@myorg/queue'
@Module({
imports: [
ConfigModule.forRoot({
SHARED_RESOURCES_PROJECT_ID: Joi.string().required()
})
})
],
controllers: [AppController],
providers: [
{
provide: 'PUBSUB',
useValue: new PubsubService()
},
{
provide: 'INTEGRATION_PUBSUB',
useValue: new PubsubService({ projectId: process.env.SHARED_RESOURCES_PROJECT_ID })
}
]
})
export class AppModule {}
@Controller()
export class AppController {
constructor(private queueService: QueueService) {}
@Post()
async create() {
...
// here I want to use queueService with `PUBSUB` injected
return this.queueService.sendMessage(...)
}
@Patch()
async update() {
...
// here I want to use queueService with `INTEGRATION_PUBSUB` injected
return this.queueService.sendMessage(...)
}
}
@Injectable()
export class QueueService {
constructor(
// how can I dynamically change `@Inject('PUBSUB')` to `@Inject('INTEGRATION_PUBSUB')`?
@Inject('PUBSUB') private readonly pubsubService: PubsubService
) {}
async sendMessage(payload): Promise<void> {
return this.pubsubService.sendMessage(payload)
}
}
【问题讨论】:
-
是否有理由不只在 QueueService 上使用
create和update方法并以这种方式引导它(例如,调用者正在调用不同的东西)?你需要触发某物与调用方不同,否则服务没有“理由”做任何不同的事情。