【问题标题】:NestJs runtime injectionNestJs 运行时注入
【发布时间】:2021-02-08 05:20:40
【问题描述】:

我之前在 express 应用中使用 inversifyjs 实现了 scinario,我需要使用 nestjs 实现它。

我有实现抽象类(Service Abstract)的服务(A,B,C),它继承自接口(IService)。我需要根据路由中的参数(/:serviceType)从上述服务(A或B或C)中注入一个。我怎样才能在巢中实现这一目标?

【问题讨论】:

  • 可能是一个“工厂”提供者,它将基于 arg(路由参数)返回其中一项服务。
  • 您的意思是使用自定义提供程序useFactory?或者你的意思是我创建了一个工厂服务,它根据参数值返回服务实例。我找不到足够的示例来应用useFactory。在 inversify 中,我可以使用 inversify 配置文件中的工厂来完成。
  • 这两个选项并不矛盾。它的工作方式取决于您是否需要 A 等作为单例。

标签: node.js dependency-injection inversion-of-control nestjs


【解决方案1】:

它可以是使用useFactory 定义的函数服务,它根据提供的参数返回 A、B 或其他:

providers: [{
  provide: 'GET_AB',
  useFactory: (a: A, b: B) => {
    return (name) => {
     if (name === 'a')
       return a;
     else if (name === 'b')
       return b;
    };
  },
  inject: [A, B]
}]

注入的GET_AB是一个类似aOrB = getAB('a')的函数;

【讨论】:

  • 感谢@estus-flask 的回复。将此代码放在app.module.ts 的哪里对或将其放在单独的文件中并将其导入app.module.ts?以及如何将其注入服务调用中,例如 product.service.ts ?感谢您的帮助
  • 这取决于你,但我认为没有理由在单独的文件中定义它,它不是可重用的代码,只需将它放在 @Module(...) 中。只要 product.service 属于具有此提供程序的模块,它就会以这种方式 docs.nestjs.com/providers#property-based-injection 或这种方式注入 @Inject docs.nestjs.com/fundamentals/…
  • 所以注入将是这样的:@Inject('GET_AB') providerFactory : GetAB,但 GetAB 它是未定义的
  • 并称它为this.providerFactory('a'),对吧?
  • 是的,就是这么叫的。没有 GetAB,也没有必要拥有它,因为 dep 类型不用于带有@Inject 的 DI。您可能想在 providers 之外声明工厂函数只是为了打字,export const getABFactory = (a: A, b: B) => ...,然后它将是 @Inject('GET_AB') providerFactory : ReturnType<typeof getABFactory>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2021-12-01
  • 2021-04-06
相关资源
最近更新 更多