2014-09-20 4 views
5

Я немного смущен о происхождении объектов в среде, которая использует CQRS & Event Sourcing. Чтобы сделать мой вопрос понятным, давайте возьмем следующий хорошо известный пример интернет-магазина:DDD, CQRS, Event Sourcing: Откуда берутся сущности?

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

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

ответ

3

В БК, содержащем Order это действительно может быть так, что Product, как часть OrderLine, это значение объекта, состоящее из значений, таких как ProductId, Name т.д.

Контекст порядок не нужен знать о товарных объектах, поскольку строки порядка обычно содержат только простые свойства только для свойства (productId/SKU, имя, количество и цена за/элемент). Поэтому Order может обеспечить функцию, такую ​​как

void addOrderLine(ProductId productId, String productName, BigDecimal pricePerItem, int quantity). 

Это на самом деле не имеет значения для «порядка» -bc где эти значения productId, productName и т.д. произошли.

На практике, однако, это, вероятно, очень вероятно, что эти значения могут быть получены из другого ограниченного контекста, скажем, «Продукт» -BC, который отвечает за управление запасами и т.д.

Это довольно часто, чтобы позволить UI дирижировать эти BKS:

  • пользовательский интерфейс (веб-магазин для клиентов, например) загружает продукты и их цены от «продукт-BC»
  • пользователь размещает продукты в корзине (давайте предположим, для простоты это также «Приказ-BC»). Ибо UI запускает команды, такие как AddToShoppingBasketCommand(productId, productName, quantity, price), которые обрабатываются «Заказ» -BC.
  • Когда пользователь хочет разместить заказ на текущую покупку, он запускает PlaceOrderCommand.
  • Обработчик команд для PlaceOrderCommand принимает текущую корзину покупок и создает соответствующий Order; все, что ему нужно, для каждого продукта - соответствующие свойства продуктов, которые уже были указаны в корзине покупок (и первоначально были в AddToShoppingBasketCommand). Обратите внимание, что ему не нужно знать о понятии объекта Product из продукта BC.
+0

Я должен добавить, что последняя точка маркера должна быть выполнена через службу домена, поскольку перевод торговых корзин на заказы явно является концепцией домена. –