NestJs模块取决于提供商,ServiceLocator?

时间:2019-03-07 15:43:49

标签: dependency-injection nestjs

目标

我正在使用类似于SpringActuator的模块(我需要/ health,/ info,/ metrics等),我需要在多个应用程序中重用该模块,但是要确定该应用程序是否运行正常或获取应用程序信息是在应用程序本身定义的,我希望此执行器模块与应用程序无关。因此,我需要应用程序通过通过应用程序上下文已经存在的提供程序来导入模块。

实施

我使用ModuleRef(带有严格的选项)来创建ServiceLocator之类的东西,以便在模块初始化期间可以解决任何应用程序依赖项。

执行器模块是这样导入的

imports: [ActuatorModule.forRoot({ actuatorToken: ApplicationActuator })]

ApplicationActuator是知道应用程序是否正常的类。此提供程序可能在内部具有另一个依赖关系(嵌套)

ActuatorModule使用工厂方法来提供服务定位器(FactoryHelper)

  providers: [
    {
      provide: 'ActuatorFactoryHelper',
      useFactory: (moduleRef: ModuleRef) => new FactoryHelper(moduleRef, options.actuatorToken),
      inject: [ModuleRef],
    }
  ]

最后,我的服务像这样使用FactoryHelper

get actuator(): Actuator {
  return this.factoryHelper.instance;
}

constructor(@Inject('ActuatorFactoryHelper') private readonly factoryHelper: FactoryHelper<Actuator>) {}

这是FactoryHelper的外观

export class FactoryHelper<T> implements OnModuleInit {

   instance: T;

   constructor(
     private readonly moduleRef: ModuleRef,
     private readonly token: Type<any> | string | symbol,
   ) {}

   onModuleInit() {
     this.instance = this.moduleRef.get(this.token, { strict: false 
   });
  }
}

问题

我在另一个线程中读到,有一个模块取决于提供程序是一种不良习惯,这是一种不良习惯吗?我可以面对什么问题?这是一种更简单的方法吗?

注释

  • 我尝试使用自定义提供程序(useFactory),但嵌套的依赖项未解决(它们对执行器模块不可见)。

谢谢。

0 个答案:

没有答案