如何处理DDD中聚合之间的关联?

时间:2009-02-06 20:31:43

标签: domain-driven-design aggregate

我仍然围绕着DDD,我遇到的一个绊脚石是如何处理不同聚合之间的关联。假设我有一个聚合封装客户和另一个封装货件。

出于商业原因,发货是他们自己的聚合,但他们需要明确地与客户联系。我的客户域实体是否应该有发货清单?如果是这样,我如何在存储库级别填充此列表 - 假设我有一个CustomerRepository和一个ShipmentRepository(每个聚合一个repo)?

我说'关联'而不是'关系',因为我想强调这是一个域决策,而不是基础架构 - 我首先从模型设计系统。

编辑:我知道我不需要将表直接建模到对象 - 这就是我首先设计模型的原因。在这一点上,我根本不关心数据库 - 只是这两个聚合之间的关联。

3 个答案:

答案 0 :(得分:8)

您的ShipmentRepository无法将客户数据汇总到您的货件模型中。存储库不必与表进行1对1映射。

我有几个存储库,它们将多个表组合成一个域模型。

答案 1 :(得分:5)

我认为回答这个问题有两个层次。在一个层面上,问题是如何填充客户和货件之间的关系。我非常喜欢“填充”语义,您的货件存储库可以有一个fillOrders(列出客户,......)。

另一个层次是“我如何处理作为DDD一部分的非规范化域模型”。而“客户”可能是他们所有人中最好的例子,因为它只是出现在很多不同的背景中;几乎所有流程都有客户,客户的背景通常非常多样化。最多只有一半时间你对“订单”感兴趣。如果我在开始时对域名的理解是完美的,那么我从不制定客户域概念。但事实并非如此,所以我总是最终制作Customer对象。我还记得我在 3年之后认为我能够制作正确的“客户”域模型的项目。我寻找代表客户的替代和更详细的概念; PotentialCustomer,OrderingCustomer,CustomerWithOrders以及其他一些人;对不起,名字不是更好。我还需要更多的时间;)

答案 2 :(得分:0)

货件与客户有多对一的关系。 如果您正在寻找客户的货件,请向您的货件存储库添加一个带有客户参数的查询。

一般情况下,当多方不受限制时,我不会在实体之间建立一对一的关联。