目标
我正在使用类似于 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 …Run Code Online (Sandbox Code Playgroud)