domain-driven-design - 正确设计汇总根

标签 domain-driven-design aggregate

我在设计聚合根时遇到一些问题。这就是我的想法:)

Store (the aggregate root)
-> Sales - A store create a sale every day
 -> Zones - A store is divided into zones
    -> Styles - A zone has x number of styles
       --> Colors - A style has x number of colors
    etc..

现在,基于此,我的聚合根将是商店。但是,如果现在我要围绕它创建一个存储库,它会看起来像这样吗?
public class StoreRepository()
{
  Store GetById() {...}
  StoreZone GetZone() {...}
  List<StoreZoneStyle> GetStylesByZone() {...}
  List<Color> GetColorsByStyle() {...}
}

这是继续的好方法吗?
不用说我是DDD的新手。

最佳答案

我认为您需要将聚合边界和实体视为不仅仅是层次结构。很有可能,您将拥有比这更丰富的模型。

判断聚合是否正确的第一种方法是,您可以查看聚合中的每个实体,然后询问“是否需要直接访问此对象?”如果回答"is",则该实体可能不属于集合。

在不了解您的域的情况下,我可能会认为Store确实是一个集合。另一方面,销售更为复杂。是的,销售发生在商店中,但是您是否需要独立使用销售?如果您在仅与商店合作的范围之外需要它们,则Sales可能不在该汇总范围之内。

我在想象样式和颜色都是不可变且可重复的,因此在这种情况下它们很可能是值对象。区域是商店唯一的,还是变化?

就个人而言,我发现在纸上(或白板)领域中确定所有项目的值(value)。我将与利益相关者一起进行发现阶段,然后将他们带到那里。然后,将这些单词用作对话中的领导者,以试图理解它们之间的关系。如果您对利益相关者的采访足够好,那么他/她提供的描述实际上将定义您要寻找的大部分内容。

不要打败一匹老马,但是埃文斯的书绝对值得一读。有点干,但是很有见地。为了快速起步,您可以在InfoQ上阅读free book,它基本上是Evans书的摘要。

关于domain-driven-design - 正确设计汇总根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1639773/

相关文章:

domain-driven-design - 强制聚合之间不变量的最佳方法?

domain-driven-design - DDD : Entity as a factory for value objects?

java - GroupBy 框架

对三个表进行 SQL JOIN、GROUP BY 以获得总计

c# - 洋葱架构中的典型层是什么?

domain-driven-design - 持久性应该是域对象的责任吗? (你能评论这篇文章吗?)

asp.net - Asp.net Web API 2.2 OData4 是否支持 group by 子句?

r - 另一个聚合

architecture - 微服务架构 : Chatty services or data duplication

c# - 使用第一对作为种子聚合