В новом новом проекте я использую подход с использованием командной шины, проблема, с которой я сталкиваюсь, заключается в том, как я должен обрабатывать отношения.
Например, у Заказа есть несколько Строк Заказа, адрес Отправления и Счет-фактура.
Поскольку я использую подход командной шины, я хочу передать DTO моей командной шине, содержащей всю информацию, необходимую для создания Ордена.
Должна ли эта команда также содержать отношения (т. Е. CreateOrderTask, CreateOrderAddress)?
Моя структура каталогов / файлов выглядит следующим образом:
- Infrastructure
-- Ui
--- Web
---- CreateOrderController.php
-- ....
- Application
-- CreateOrder
--- CreateOrder.php
--- CreateOrderHandler.php
--- CreateOrderLine.php (?)
- Domain
-- Order
--- Order.php
--- OrderLine.php
--- Address.php
-- ...
Так что класс CreateOrder должен выглядеть так:
// CreateOrder.php
<?php
class CreateOrder {
/** @var CreateOrderLine[] */
protected $createOrderLines;
public function __construct(array $createOrderLines)
{
$this->createOrderLines = $createOrderLines;
}
public function getCreateOrderLines()
{
return $this->createOrderLines;
}
}
Хотя я думаю, что есть много правильных ответов, я ищу лучшую практику. о чем ты думаешь?
Это зависит от границ вашей транзакции.
Если вам это нужно все команды должны быть успешными или терпеть неудачу вместе тогда вы на самом деле должны иметь больше Команда со всеми необходимыми данными.
Если какая-либо из подкоманд завершается неудачно, и система все еще находится в допустимом состоянии, вам не нужна команда большего размера, и вы можете отправлять несколько команд в некотором пакете, каждая из которых имеет свою собственную границу транзакции.
Электронная коммерция — довольно популярный домен, и здесь может быть интереснее посмотреть, каковы бизнес-особенности поведения вашей системы.
Немного отойдя от CQRS, я бы задал вам несколько вопросов в «DDD-стиле»:
CreateOrder
средства? Кто их создает?Я бы предупредил вас о чрезмерном упрощении рассматриваемой области и чрезмерном проектировании решения …
Если у вас в конце дня будет корзина покупок — возможно, у вас есть команды для добавления товаров в нее. Эти команды будут выполняться асинхронно. Здесь не будет AddShoppingCartHeader
команда, потому что это не имеет никакого смысла для бизнеса. При оформлении заказа корзина, вероятно, будет преобразована в заказ. Или, после тайм-аута, он будет отброшен и будет создан потенциальный клиент. Если все это верно — вы, вероятно, захотите взглянуть на шаблон диспетчера процессов (также называемый Saga во многих системах обмена сообщениями).