DDD,CQRS,事件采购:实体来自哪里?

时间:2014-09-20 16:23:58

标签: entity domain-driven-design cqrs event-sourcing

我对利用CQRS&amp ;;的环境中实体的起源感到有些困惑。活动采购。为了使我的问题清楚,请使用以下众所周知的网上商店示例:

您可以将订单建模为聚合根。订单接受订单行,订单行本身由产品和数量定义。

由于订单行是在订单处理过程中构建的实体,因此产品的概念似乎也是一个实体。但产品甚至产品目录来自哪里?在我看来,在订单的有限上下文中没有像产品聚合根这样的东西。那么订单背景如何知道产品实体呢?它们是否在另一个有界的上下文中维护,并以某种方式在订单上下文的读取存储中实现?

1 个答案:

答案 0 :(得分:3)

在包含Order的BC中,Product作为OrderLine的一部分,可能确实是一个值对象,由ProductId等值组成},Name等。

订单上下文不需要了解产品实体,因为订单行通常只包含简单的仅限价值的属性(productId / SKU,名称,数量和每个/项目的价格)。因此,Order可以提供诸如

之类的功能
void addOrderLine(ProductId productId, String productName, BigDecimal pricePerItem, int quantity).

它实际上与"订单" -BC无关,其中productIdproductName等的这些值来自。

然而,在实践中,很可能这些价值可以从另一个有限的背景中获得,例如"产品" -BC,它负责库存管理等。

让UI协调这些BC很常见:

  • UI(例如,客户的网上商店)从" Product-BC"加载产品及其价格。
  • 用户将产品放入购物篮(为简单起见,我们假设这也是" Order-BC")。因为,用户界面会触发由{"订单" -BC。
  • 处理的AddToShoppingBasketCommand(productId, productName, quantity, price)等命令。
  • 当用户想要下载当前购物的订单时,会触发PlaceOrderCommand
  • PlaceOrderCommand的命令处理程序获取当前购物篮并构造相应的Order;对于每种产品,它所需要的只是已经在购物篮中列出的产品的相应属性(最初位于AddToShoppingBasketCommand)。请注意,它不需要了解Product-BC中Product实体的概念。