代码之家  ›  专栏  ›  技术社区  ›  Erik Forbes

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

  •  16
  • Erik Forbes  · 技术社区  · 16 年前

    我仍然在用DDD来绕圈子,我遇到的一个障碍是如何处理不同聚合之间的关联。假设我有一个聚合封装客户和另一个封装发货。

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

    我说的是“关联”而不是“关系”,因为我想强调这是一个领域决策,而不是一个基础设施决策——我首先从模型设计系统。

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

    3 回复  |  直到 16 年前
        1
  •  8
  •   Todd Smith Brandon    16 年前

    ShipmentRepository没有理由不能将客户数据聚合到装运模型中。存储库不必对表进行1对1的映射。

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

        2
  •  5
  •   krosenvold    16 年前

    我认为回答这个问题有两个层次。在一个层次上,问题是如何填充客户和装运之间的关系。我真的很喜欢“填充”语义,在这个语义中,您的装运存储库可以有一个填充订单(列出客户,…)。

    另一个层次是“如何处理作为DDD一部分的非规范化域模型”。“客户”可能是所有流程中最好的例子,因为它只在如此多的不同环境中出现;几乎所有的流程都有客户在其中,而客户的环境通常非常不同。最多一半时间你对“订单”感兴趣。如果我开始时对这个领域的理解是完美的,我会 从未 制定客户领域概念。但事实并非如此,所以我总是以客户为目标。我仍然记得我追求的项目 3年 我觉得我可以制作适当的“客户”域模型。我 寻找替代和更详细的概念,也代表客户;潜在客户,订单客户,有订单的客户,可能还有其他一些;抱歉,名字没有更好。我需要更多的时间来做这件事;)

        3
  •  0
  •   Simon Laroche    16 年前

    发货与客户有多对一关系。 如果您要查找客户机的发货,请向发货存储库添加一个查询,该查询采用客户机参数。

    一般来说,当多方面不受限制时,我不会在实体之间创建一对多的关联。