【问题标题】:How can I dynamically inject different providers with Nest.js?如何使用 Nest.js 动态注入不同的提供者?
【发布时间】: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 上使用 createupdate 方法并以这种方式引导它(例如,调用者正在调用不同的东西)?你需要触发某物与调用方不同,否则服务没有“理由”做任何不同的事情。

标签: oop nestjs


【解决方案1】:

创建对象(在本例中为控制器)后无法进行动态注入。所以你有两个选择

1- 创建两个 QueueService(一个用于 PUBSUB,另一个用于 INTEGRATION_PUBSUB)并将两者注入控制器。在您的控制器功能中使用它们。 (我推荐这个)

2- 将 PUBSUB 和 INTEGRATION_PUBSUB 注入 QueueService 并在 sendMessage 函数中传递另一个参数。所以检查此参数以在 PUBSUB 和 INTEGRATION_PUBSUB 之间进行选择

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-19
    • 2019-01-07
    • 2023-04-04
    • 1970-01-01
    • 2021-01-05
    • 2015-11-11
    • 1970-01-01
    • 2014-01-19
    相关资源
    最近更新 更多