需要共享实体的聚合

时间:2012-10-11 14:07:45

标签: language-agnostic domain-driven-design entity aggregate aggregateroot

考虑我的情景,该模型包含两个聚合根CustomerOrder以及“共享”实体Address

另请注意,Address abstract具有以下子类:PhysicalAddressPostOfficeBoxAddressPrivateBagAddress

Customer可以将许多地址组织到某种地址簿中。 在下订单时,客户可以从他们的地址簿中选择Address作为送货地址。

我最初的想法是在两个实体之间共享一个地址,但我已经选择退出,因为这会给管理各自的不变量带来麻烦。

我可以选择的另一个选项是创建两个Address层次结构,每个层次结构用作客户地址或收货地址。这似乎也不正确,因为有很多重复的代码。

我如何正确地模拟这种情况?

1 个答案:

答案 0 :(得分:2)

实体是应该能够存在的东西,例如客户或订单。但是,Address不是实体,Address是值类型,因此不能独立存在:

  1. 地址只能作为在实体中聚合的值类型存在
  2. 您可以将地址层次结构定义为域中的值类型,但许多实体可能会使用此类型。
  3. 我们发现我们一直遇到这些类型的实体,例如Address,MoneyType等。

    解决方案是在您的域中创建1个地址层次结构值类型。然后,任何实体都可以将地址作为适用的财产