Цель
Я работаю в модуле, похожем на 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), но вложенные зависимости не были разрешены (они не видны модулю привода).
Заранее спасибо.