Обработчик команды в Nest
Команда уже уходит в шину, но массив всё ещё может жить в сервисе страницы, и граница между HTTP слоем и изменением состояния размывается. Повторная запись с другого места снова тянет копирование.
Обработчик команды
- отдельный класс с пометкой
@CommandHandler,
который реализует
ICommandHandler
и содержит код записи.
Его регистрируют в провайдерах
модуля, Nest связывает тип
команды с этим классом
при старте процесса NodeJS.
Покажем на примере постов:
import { Injectable } from '@nestjs/common';
@Injectable()
export class PostMemory {
posts: { title: string }[] = [];
}
Обработчик достаёт заголовок из команды и добавляет объект в общий массив:
import { CommandHandler, ICommandHandler } from '@nestjs/cqrs';
import { CreatePostCommand } from './create-post.command.js';
import { PostMemory } from './post.memory.js';
@CommandHandler(CreatePostCommand)
export class CreatePostHandler
implements ICommandHandler<CreatePostCommand>
{
postMemory: PostMemory;
constructor(postMemory: PostMemory) {
this.postMemory = postMemory;
}
async execute(command: CreatePostCommand) {
const post = { title: command.title };
this.postMemory.posts.push(post);
return post;
}
}
Корневой модуль подключает шину, память, обработчик и сервис, который только отправляет команду:
import { Module } from '@nestjs/common';
import { CqrsModule } from '@nestjs/cqrs';
import { PostController } from './post.controller.js';
import { CreatePostHandler } from './create-post.handler.js';
import { PostMemory } from './post.memory.js';
import { PostService } from './post.service.js';
@Module({
imports: [CqrsModule.forRoot()],
controllers: [PostController],
providers: [
PostMemory,
PostService,
CreatePostHandler,
],
})
export class AppModule {}
Вынесите запись работника
в CreateWorkerHandler,
храните список в
WorkerMemory
и зарегистрируйте оба класса
в корневом модуле рядом
с WorkerService.