Използвайте шаблона CQRS внимателно и можете да създадете по-чисти, по-мащабируеми приложения Nest.
Често срещан подход към разработването на NestJS е изграждането на услуги, с които контролерите комуникират за достъп до данни. Но този подход не е единственият валиден модел на проектиране в NestJS. Има и други модели на проектиране, като модела на проектиране CQRS.
CQRS е шаблон за проектиране, който разделя операциите за четене и запис на приложение. Това разделяне може да помогне за подобряване на мащабируемостта, производителността и поддръжката.
Научете всичко за CQRS и как можете да го приложите, когато създавате NestJS API.
Какво е CQRS?
CQRS означава разделяне на отговорността за команди и заявки. Той реализира използването на команди за създаване, актуализиране и изтриване на данни и заявки за извличане на данни. Това помага да се елиминира необходимостта от внедряване на извиквания на база данни на приложение в услуги.
Той също така позволява ясно разграничение между логиката на запитване към базата данни за данни и извършването на други действия в приложение.
Подходът CQRS е полезен при управляван от домейн дизайн, което ви позволява да разделите логиката на домейна и инфраструктурните операции във вашето приложение. Можете също да го използвате за внедряване на сложна бизнес логика, но това не се препоръчва за по-прости приложения.
Използване на CQRS в NestJS API
Можете да използвате шаблона за проектиране CQRS в API, който изграждате в NestJS. За да следвате, трябва да имате Node.js, инсталиран на вашия компютър и скорошна версия на NestJS.
Използвайте следните стъпки, за да създадете просто приложение за блогове, което имплементира шаблона за проектиране CQRS.
Създайте проект Nest
Създайте нов проект Nest и генерирайте a пост ресурс за блог приложение. Можете да направите това, като изпълните следните команди в терминал:
гнездо нов nestjs-cqrs
nest g модулни постове
nest g контролни постове
nest g сервизни постове
Инсталиране на зависимости
След като изпълните стъпките по-горе, изпълнете тази терминална команда, за да инсталирате пакета NestJS CQRS:
npm install --save @nestjs/cqrs
Създайте пощенска услуга
Добавете следния код към вашия posts.service.ts файл за определяне на PostService клас.
// posts.service.ts
импортиране { Инжекционен } от„@nestjs/common“;износинтерфейс публикация {
заглавие: низ;
съдържание: низ;
}@Инжекционен()
износклас PostService {
частен публикации само за четене: публикация [] = [];създаване (публикуване: Публикуване): Публикуване {
това.posts.push (пост);
връщане пост;
}
findById (id: номер): Публикувай {
връщанетова.posts.find(пост => post.id id);
}
}
The PostService определя създавам и findById методи за създаване на нова публикация и получаване на съществуваща публикация от нейния идентификатор.
Дефиниране на команди и заявки
Следващата стъпка е да се дефинират заявките и командите, които са в основата на шаблона за проектиране на CQRS.
В публикации директория, създайте два нови файла: създайтеPostCommand.command.ts и getPostQuery.query.ts. Командният файл трябва да изглежда така:
// createPostCommand.command.ts
износклас CreatePostCommand {
конструктор(публичен заглавие само за четене: низ, публичен съдържание само за четене: низ) {}
}
И файлът с дефиниция на заявката, като този:
// getPostQuery.query.ts
износклас GetPostQuery {
конструктор(публичен ИД само за четене: номер) {}
}
Създайте манипулатори на команди и заявки
След като успешно дефинирате вашите команди и заявки, трябва да създадете манипулатори за тях. Манипулаторът е функция, която изпълнява команда или заявка и връща резултата.
Създавам манипулатори.ц файл във вашия пост директория и поставете следния код в нея:
// handlers.ts
импортиране {CommandHandler, ICommandHandler} от'@nestjs/cqrs';
импортиране { CreatePostCommand } от'./createPostCommand.command.ts';
импортиране { PostService } от'./post.service';@CommandHandler(CreatePostCommand)
износклас Създаване на PostHandler инструменти ICommandHandler{
конструктор(частен само за четене postService: PostService) {}
асинхронен изпълни (команда: CreatePostCommand) {
конст { име, цена } = команда;
конст пост = изчакайтетова.postService.create (заглавие, съдържание);
връщане пост;
}
}
В същото манипулатори.ц файл, можете да промените изразите за импортиране, за да включите тези по-долу, за да позволите работа със заявки. След това можете да приложите манипулатора на заявки, както се вижда в кода по-долу:
// handler.ts
импортиране { QueryHandler, IQueryHandler } от'@nestjs/cqrs';
импортиране { GetPostQuery } от'./getPostQuery.query';
импортиране { PostService } от'./post.service';// манипулатор на заявка
@QueryHandler(GetProductQuery)
износклас GetPostHandler инструменти IQueryHandler{
конструктор(частен само за четене postService: PostService) {}
асинхронен изпълни (заявка: GetPostQuery) {
конст { id } = заявка;
конст пост = изчакайтетова.postService.findOneById (id);
връщане пост;
}
}
Регистрирайте манипулатори
Последната стъпка е да регистрирате манипулаторите на команди и заявки с модула NestJS.
// post.module.ts
импортиране { Модул } от„@nestjs/common“;
импортиране {CommandHandlers, QueryHandlers} от'handlers.ts';
импортиране { PostService } от'./post.service';
@Модул({
доставчици: [
PostService,
...CommandHandlers,
...QueryHandlers,
],
})
износклас PostModule {}
Този код регистрира PostService, CommandHandlers, и QueryHandlers в доставчици масив. Използването на оператор за разпространение (...) е да обедини масивите от заявка манипулатори и команда манипулатори в доставчици масив.
Изпълнявайте команди и заявки
Регистрираните команди и манипулатори на заявки могат да се използват в контролери. Следният код е имплементацията на a публикации контролер, който ще приема HTTP заявки и ще връща необходимите отговори.
// posts.controller.ts
импортиране {Тяло, контролер, пост} от„@nestjs/common“;
импортиране {CommandBus} от'@nestjs/cqrs';
импортиране { CreatePostCommand } от'./createPostCommand.command.ts';// контролер, който изпълнява команда
@Контролер("постове")
износклас PostController {
конструктор(частен само за четене commandBus: CommandBus) {}
@Публикуване()
асинхронен createPost(@Тяло() тяло: { заглавие: низ; съдържание: низ }) {
конст { заглавие, съдържание } = тяло;
конст команда = нов CreatePostCommand (заглавие, съдържание);
конст пост = изчакайтетова.commandBus.execute (команда);
връщане пост;
}
}
В кода по-горе, CommandBus изпълнява CreatePostCommand и създава нова публикация.
Този код показва как да внедрите контролер, който използва заявка:
// posts.controller.ts
импортиране { Controller, Get, Param } от„@nestjs/common“;
импортиране {QueryBus} от'@nestjs/cqrs';
импортиране { GetPostQuery } от'./getPostQuery.query';@Контролер("постове")
износклас PostController {
конструктор(частен само за четене queryBus: QueryBus) {}
@Вземете(':документ за самоличност')
асинхронен getPost(@Парам('документ за самоличност') документ за самоличност: номер) {
конст заявка = нов GetPostQuery (id);
конст пост = изчакайтетова.queryBus.execute (заявка);
връщане пост;
}
}
The queryBus изпълнява GetPostQuery който получава публикацията с даден ID и я връща.
След като изпълните всички стъпки по-горе, вече трябва да имате минималистично работещо приложение за създаване и извличане на публикации в блогове.
Въпреки че кодът тук използва масив за съхраняване на създадените публикации в паметта, по-вероятно е да използвате база данни в производството. Можете да използвате или a SQL база данни, или a NoSQL база данни като MongoDB, тъй като NestJS поддържа и двете опции.
Изграждане на API с шаблона за проектиране CQRS
Включването на шаблона за проектиране CQRS във вашето приложение NestJS може да помогне за мащабируемост, производителност и поддръжка. CQRS позволява по-ефективни и оптимизирани операции чрез разделяне на операциите за четене и запис, извършвани от приложението.
Пакетът @nestjs/cqrs предоставя градивен елемент за внедряване на CQRS в NestJS с команди и манипулатори на заявки. Като цяло CQRS е мощен модел, който може да помогне за създаването на по-ефективни и мащабируеми приложения и трябва да претеглите възможностите си, преди да го използвате.