Как обрабатывать отношения с помощью командной шины, используя DTO

В новом новом проекте я использую подход с использованием командной шины, проблема, с которой я сталкиваюсь, заключается в том, как я должен обрабатывать отношения.

Например, у Заказа есть несколько Строк Заказа, адрес Отправления и Счет-фактура.

Поскольку я использую подход командной шины, я хочу передать 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;
}
}

Хотя я думаю, что есть много правильных ответов, я ищу лучшую практику. о чем ты думаешь?

1

Решение

Это зависит от границ вашей транзакции.

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

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

3

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

Электронная коммерция — довольно популярный домен, и здесь может быть интереснее посмотреть, каковы бизнес-особенности поведения вашей системы.

Немного отойдя от CQRS, я бы задал вам несколько вопросов в «DDD-стиле»:

  • Откуда поступает заказ?
  • Какие CreateOrder средства? Кто их создает?
  • А как насчет корзины? Разве это не заполнено одной линией?
  • Разве вашему бизнесу тоже не нужно знать об отмененных корзинах?

Я бы предупредил вас о чрезмерном упрощении рассматриваемой области и чрезмерном проектировании решения …

Если у вас в конце дня будет корзина покупок — возможно, у вас есть команды для добавления товаров в нее. Эти команды будут выполняться асинхронно. Здесь не будет AddShoppingCartHeader команда, потому что это не имеет никакого смысла для бизнеса. При оформлении заказа корзина, вероятно, будет преобразована в заказ. Или, после тайм-аута, он будет отброшен и будет создан потенциальный клиент. Если все это верно — вы, вероятно, захотите взглянуть на шаблон диспетчера процессов (также называемый Saga во многих системах обмена сообщениями).

2

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