NestJs 模块取决于提供商 ServiceLocator?

Jav*_*rez 5 dependency-injection nestjs

目标

我正在使用类似于 SpringActuator 的模块(我需要 /health、/info、/metrics 等),我需要在多个应用程序之间重用该模块,但是确定应用程序是否健康或获取应用程序的逻辑信息是在应用程序本身定义的,我希望这个执行器模块与应用程序无关。因此,我需要应用程序导入模块,传递应用程序上下文中已存在的提供程序。

执行

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

执行器模块是这样导入的

imports: [ActuatorModule.forRoot({ actuatorToken: ApplicationActuator })]
Run Code Online (Sandbox Code Playgroud)

ApplicationActuator 是了解应用程序是否健康的类。该提供程序可能在内部有另一个依赖项(嵌套)

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

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

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

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

constructor(@Inject('ActuatorFactoryHelper') private readonly factoryHelper: FactoryHelper<Actuator>) {}
Run Code Online (Sandbox Code Playgroud)

这就是 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 
   });
  }
}
Run Code Online (Sandbox Code Playgroud)

问题

我在另一个线程中读到,拥有依赖于提供者的模块是一种不好的做法,这是一种不好的做法吗?我可能会面临什么问题?这是一种更简单的方法吗?

笔记

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

提前致谢。