Модуль NestJs в зависимости от провайдера, ServiceLocator? - PullRequest
2 голосов
/ 07 марта 2019

Цель

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

Заранее спасибо.

...