Использование фабрики для создания контроллера

Мне было интересно, могу ли я использовать фабрику для инициализации контроллера, а затем добавить его в модуль. Код может выглядеть примерно так, но это не работает:

const controllerFactory = {
  provide: DefinitionController,
  useFactory: async (service: DefinitionService) => {
    //initialization of controller
    return new DefinitionController();
  },
  inject: [DefinitionService],
};
@Module({
  controllers: [controllerFactory],
  providers: [DefinitionService],
})
export class DefinitionModule {}

Похоже, использование фабрики для контроллеров не поддерживается, но я не уверен. Есть пример использования фабрики для провайдеров, но я не могу найти ничего для контроллера в документации или в Google.

1 ответ

Решение

Невозможно определить ваш контроллер с асинхронной фабрикой, сравнимой с пользовательскими провайдерами. Вы не можете добавить динамические конечные точки / маршруты, если не используете собственный экземпляр express/fastify:

На данный момент нет способа динамически зарегистрировать маршрут, кроме как с использованием внутреннего экземпляра HTTP / Fastify / Express.

Существует проблема, где обсуждается модуль динамической маршрутизации, но это, вероятно, не будет частью гнезда очень скоро:

В настоящее время и Камил, и я действительно заняты, поэтому эта проблема может занять некоторое время - кроме того, что кто-то другой выполняет задачу:)


Но вы можете использовать событие жизненного цикла OnModuleInit для статической инициализации:

@Injectable()
export class DefinitionController implements OnModuleInit {
  onModuleInit() {
    console.log(`Initialization...`);
  }

Он будет вызываться один раз, когда ваше приложение запускается и имеет доступ к провайдерам, введенным в ваш контроллер, например, к вашему DefinitionService,

Другие вопросы по тегам