【问题标题】:Repositories for Aggregate Root Only!仅聚合根的存储库!
【发布时间】:2010-01-26 06:00:08
【问题描述】:

我有类别和产品实体。两者之间的关系是一对多的。因为,Category 是聚合根,我认为我应该只创建一个存储库 ICategoryRepository,它也应该处理产品。

想法?

【问题讨论】:

  • 我的 DDD 副本在家里,所以我会将存储库/聚合根问题留给其他人,但首先,您确定 Category 真的是聚合根吗?简单地具有一对多关系并没有指定根。以此为根意味着您只能检索一个类别中的所有产品。此外,通常像 Category 这样的东西会被建模为一个值而不是实体对象。

标签: dns domain-driven-design


【解决方案1】:

我目前没有我的Domain Driven Design by Evans 副本,这是我寻求明确答案的地方,但dddstepbystep 的此参考说明:

在聚合中有一个 聚合根。总根是 所有其他的父实体 实体和值对象 聚合。

一个存储库在一个 聚合根

所以是的,按照这个定义,您的 Category Repository 应该负责在 Category 聚合中持久化所有实体。

尽管如此,我的评论中的问题仍然存在 - 你确定 Category 真的是一个有用的聚合根吗?您问这个关于持久化产品的问题的事实表明,您经常认为它们与它们的类别分开,或者至少希望能够处理除它们的类别之外的某些产品。

【讨论】:

  • 这很有趣,因为产品必须有一个类别,否则它将不存在。所以,我认为由于这种关系,Category 是聚合根。如果我错了,请纠正我!我认为 Person 和 Address 也有相同的关系,其中 Person 是聚合根。
  • @john 在这里查看这篇文章:lostechies.com/blogs/jimmy_bogard/archive/2008/05/20/… 他谈到了聚合、根、实体和值。关键声明是根实体是聚合中唯一可以直接从其他聚合中引用的实体。这并不是说你的建模是错误的,只是看起来……对我来说很奇怪——但我很可能完全错了!
  • 我认为在这种情况下产品应该有一个单独的代表。因为客户可以在他的购物车中添加产品。 user.Cart.AddProduct(产品)。如果将 Category 设为聚合根,那么我应该从 Category 对象遍历关系。
  • @john 看看这个所以发帖stackoverflow.com/questions/25042/… 我同意那里的共识——从 DDD 的角度来看,让存储库在聚合的一部分上工作是一种气味。您是否考虑过有两种聚合,一种专注于您的类别,一种专注于产品?另外,在您提到的情况下,为什么产品不是订单聚合的一部分的实体?因此,您可以从订单中引用(通过或不通过类别,取决于您的根)产品实体,并且在您保存订单时也可以保存产品。
  • @john 稍微折叠一下上面的评论 - 你现在不是在处理一个订单/购物车聚合,它有一个存储库来保存购物车中的产品吗?
猜你喜欢
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多