Если команды (CQRS) являются действиями пользовательского интерфейса, относятся ли они к уровню представления?

Должен ли я вводить Command а также EventBus в Controllerили я должен сделать инъекцию Domain Service в Controller, и разреши Domain Service создать Command и отправить в Command Bus?

Пример:

// CreateUserController.php

public function __construct (CreateUserCommand $command, CommandBus $cm) {
...
}

public function createAction(Request $request) {
// data validation
$this->command->setData($request->getData());
try {
$this->cm->handle($this->command)
} catch (Exception $e) {
return new Response(500)     // assume Response accepts http code
}
return new Response(200);
}

Или лучше позвонить в доменную службу?

// CreateUserController.php

public function __construct (UserService $userService) {
...
}

public function createAction(Request $request) {
// data validation
$name = $request->getData()['name'];
$lastname = $request->getData()['lastname'];

try {
$this->userService->createUser($name, $lastname)();
} catch (Exception $e) {
return new Response(500)     // assume Response accepts http code
}
return new Response(200);
}

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

Но тогда, если команды принадлежат к уровню представления, рабочий процесс будет:

Уровень представления (запрос) -> Домен (служба) -> Уровень представления (команда и обработчик команд) -> Домен -> Уровень представления (ответ)

0

Решение

CQRS заимствует много идей из . Когда Эрик Эванс первоначально описал DDD в синяя книга, он работал с трехуровневой архитектурой: приложение / домен / постоянство.

Одной из ключевых абстракций является шов между приложением и доменом, который называется хранилищем. На этой границе взаимодействие обычно выглядит

$user = repository->getById($id)
$user->create($name, $lastName)
repository->save($user)

Обратите внимание, что вся логика домена скрыта где-то за $ user.

Если вы хотите взять этот блок кода и обернуть его в «службу», это нормально. Но это, как правило, считается служба приложений, а не доменная служба. Смотри Хорикова для обзор различия , или же Дубль джимми богарда.

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]