Использование фабрики для создания контроллера
Мне было интересно, могу ли я использовать фабрику для инициализации контроллера, а затем добавить его в модуль. Код может выглядеть примерно так, но это не работает:
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
,