Используйте шаблон CQRS с осторожностью, и вы сможете создавать более чистые и масштабируемые приложения Nest.
Обычный подход к разработке NestJS заключается в создании сервисов, с которыми контроллеры взаимодействуют для доступа к данным. Но этот подход — не единственный допустимый шаблон проектирования в NestJS. Существуют и другие шаблоны проектирования, такие как шаблон проектирования CQRS.
CQRS — это шаблон проектирования, который разделяет операции чтения и записи в приложении. Такое разделение может помочь улучшить масштабируемость, производительность и удобство обслуживания.
Узнайте все о CQRS и о том, как его можно применить при создании NestJS API.
Что такое CQRS?
CQRS означает разделение ответственности команд и запросов. Он реализует использование команды создавать, обновлять и удалять данные и запросы для получения данных. Это помогает устранить необходимость реализации вызовов базы данных приложения в службы.
Это также позволяет четко различать логику запроса данных к базе данных и выполнения других действий в приложении.
Подход CQRS полезен в доменно-ориентированный дизайн, что позволяет разделить логику предметной области и инфраструктурные операции в приложении. Вы также можете использовать его для реализации сложной бизнес-логики, но это не рекомендуется для более простых приложений.
Использование CQRS в NestJS API
Вы можете использовать шаблон проектирования CQRS в API, созданном в NestJS. Чтобы следовать, вам нужно иметь Node.js установлен на вашем компьютере и последняя версия NestJS.
Используйте следующие шаги, чтобы создать простое приложение для ведения блога, реализующее шаблон проектирования CQRS.
Создать проект гнезда
Создайте новый проект Nest и сгенерируйте почта ресурс для приложения блога. Вы можете сделать это, выполнив следующие команды в терминале:
вложить новые NestJS-CQRS
гнездо сообщений g-модуля
посты контроллера гнезда g
сервисные посты гнездо г
Установить зависимости
После того, как вы выполнили описанные выше шаги, запустите эту команду терминала, чтобы установить пакет NestJS CQRS:
npm установить --сохранить @nestjs/cqrs
Создать почтовый сервис
Добавьте следующий код в свой сообщения.service.ts файл для определения Постсервис сорт.
// сообщения.service.ts
Импортировать { Инъекционный } от'@nestjs/общий';экспортинтерфейс Почта {
заголовок: нить;
содержание: нить;
}@Инъекционный()
экспортсорт Почтовая служба {
частный сообщения только для чтения: Post[] = [];создать (опубликовать: опубликовать): опубликовать {
этот.posts.push (пост);
возвращаться почта;
}
findById (идентификатор: число): Почта {
возвращатьсяэтот.сообщения.найти(почта => post.id идентификатор);
}
}
Постсервис определяет создавать и найти по идентификатору методы для создания нового сообщения и получения существующего сообщения по его идентификатору.
Определение команд и запросов
Следующим шагом является определение запросов и команд, которые являются основными для шаблона проектирования CQRS.
в сообщения каталог, создайте два новых файла: создатьPostCommand.command.ts и getPostQuery.query.ts. Командный файл должен выглядеть так:
// createPostCommand.command.ts
экспортсорт CreatePostCommand {
конструктор(публичный заголовок только для чтения: нить, публичный содержимое только для чтения: нить) {}
}
И файл определения запроса, например:
// получитьPostQuery.query.ts
экспортсорт GetPostQuery {
конструктор(публичный только для чтения идентификатор: число) {}
}
Создание обработчиков команд и запросов
После того, как вы успешно определили свои команды и запросы, вам необходимо создать для них обработчики. Обработчик — это функция, которая запускает команду или запрос и возвращает результат.
Создать обработчики.ts файл в вашем почта каталог и вставьте в него следующий код:
// обработчики.ts
Импортировать { CommandHandler, ICommandHandler} от'@nestjs/cqrs';
Импортировать { CreatePostCommand } от'./createPostCommand.command.ts';
Импортировать {Постсервис} от'./post.service';@CommandHandler(Создатьпосткоманду)
экспортсорт CreatePostHandler реализует ICommandHandler{
конструктор(частный только для чтения postService: PostService) {}
асинхронный выполнить (команда: CreatePostCommand) {
константа {имя, цена} = команда;
константа сообщение = Ждитеэтот.postService.create (заголовок, контент);
возвращаться почта;
}
}
В то же самое обработчики.ts файл, вы можете изменить операторы импорта, включив в них приведенные ниже, чтобы разрешить работу с запросами. Затем вы можете реализовать обработчик запросов, как показано в приведенном ниже коде:
// обработчик.ts
Импортировать { QueryHandler, IQueryHandler} от'@nestjs/cqrs';
Импортировать {Постзапрос} от'./getPostQuery.query';
Импортировать {Постсервис} от'./post.service';// обработчик запросов
@QueryHandler(ПолучитьПродуктКери)
экспортсорт GetPostHandler реализует IQueryHandler{
конструктор(частный только для чтения postService: PostService) {}
асинхронный выполнить (запрос: GetPostQuery) {
константа {идентификатор} = запрос;
константа сообщение = Ждитеэтот.postService.findOneById (идентификатор);
возвращаться почта;
}
}
Регистрация обработчиков
Последний шаг — зарегистрировать обработчики команд и запросов в модуле NestJS.
// post.module.ts
Импортировать {Модуль} от'@nestjs/общий';
Импортировать { обработчики команд, обработчики запросов } от'handlers.ts';
Импортировать {Постсервис} от'./post.service';
@Модуль({
провайдеры: [
почтовая служба,
... обработчики команд,
... обработчики запросов,
],
})
экспортсорт Постмодуль {}
Этот код регистрирует Постсервис, Обработчики команд, и обработчики запросов в провайдеры множество. Использование оператора спреда (...) заключается в объединении массивов запрос обработчики и команда обработчики в провайдеры множество.
Выполнение команд и запросов
Зарегистрированные команды и обработчики запросов можно использовать в контроллерах. Следующий код является реализацией сообщения контроллер, который будет принимать HTTP-запросы и возвращать требуемые ответы.
// сообщения.controller.ts
Импортировать { Тело, Контроллер, Сообщение } от'@nestjs/общий';
Импортировать { Командная шина } от'@nestjs/cqrs';
Импортировать { CreatePostCommand } от'./createPostCommand.command.ts';// контроллер, реализующий команду
@контроллер('сообщения')
экспортсорт Постконтроллер {
конструктор(частный командная шина только для чтения: CommandBus) {}
@Почта()
асинхронный создать сообщение (@Тело() тело: { название: нить; содержание: нить }) {
константа {название, содержание} = тело;
константа команда = новый CreatePostCommand (название, содержание);
константа сообщение = Ждитеэтот.commandBus.execute (команда);
возвращаться почта;
}
}
В приведенном выше коде Командная шина выполняет CreatePostCommand и создает новый пост.
Этот код показывает, как реализовать контроллер, использующий запрос:
// сообщения.controller.ts
Импортировать {Контроллер, Получить, Параметр} от'@nestjs/общий';
Импортировать { шина запросов } от'@nestjs/cqrs';
Импортировать {Постзапрос} от'./getPostQuery.query';@контроллер('сообщения')
экспортсорт Постконтроллер {
конструктор(частный шина запросов только для чтения: шина запросов) {}
@Получать(':идентификатор')
асинхронный получить сообщение (@Парам('идентификатор') идентификатор: число) {
константа запрос = новый GetPostQuery (идентификатор);
константа сообщение = Ждитеэтот.queryBus.execute (запрос);
возвращаться почта;
}
}
шина запросов выполняет GetPostQuery который получает сообщение с заданным идентификатором и возвращает его.
После выполнения всех вышеперечисленных шагов у вас должно быть минималистичное работающее приложение для создания и получения сообщений в блоге.
Хотя код здесь использует массив для хранения созданных сообщений в памяти, вы, скорее всего, будете использовать базу данных в рабочей среде. Вы можете либо использовать База данных SQLили База данных NoSQL, такая как MongoDB, так как NestJS поддерживает оба варианта.
Создание API с помощью шаблона проектирования CQRS
Включение шаблона проектирования CQRS в ваше приложение NestJS может повысить масштабируемость, производительность и удобство обслуживания. CQRS позволяет выполнять более эффективные и оптимизированные операции за счет разделения операций чтения и записи, выполняемых приложением.
Пакет @nestjs/cqrs предоставляет строительный блок для реализации CQRS в NestJS с помощью команд и обработчиков запросов. В целом, CQRS — это мощный шаблон, который может помочь в создании более эффективных и масштабируемых приложений, и вы должны взвесить свои варианты, прежде чем использовать его.