我正在努力思考如何正确地使用存储库模式。聚合根的核心概念不断出现。当我在web和Stack Overflow上搜索什么是聚合根时,我一直在寻找关于聚合根的讨论,以及指向应该包含基本定义的页面的死链接。

在存储库模式的上下文中,什么是聚合根?


当前回答

在Erlang中,一旦聚合由状态内的数据结构组成,而不是OO组合,就不需要区分聚合。参见示例:https://github.com/bryanhunter/cqrs-with-erlang/tree/ndc-london

其他回答

如果您采用数据库优先的方法,则聚合根通常是1-多关系中第一边的表。

最常见的例子是Person。每个人都有许多地址、一张或多张工资单、发票、CRM条目等。并非总是如此,但有9/10次都是如此。

我们目前在一个电子商务平台上工作,我们基本上有两个聚合根:

客户 卖家

客户提供联系信息,我们将交易分配给他们,交易获得行项目,等等。

卖家出售产品,有联系人,关于我们的页面,特别优惠等。

这些分别由Customer和Seller存储库负责。

聚合根是一个简单概念的复杂名称。


一般的想法

设计良好的类图封装了它的内部结构。访问该结构的点称为聚合根。

解决方案的内部结构可能非常复杂,但是这个层次结构的用户将只使用root. dosomethingwherehasbusinessmeaning()。


例子

检查这个简单的类层次结构

你想怎样驾驶你的车?选择更好的API

选项A(它只是以某种方式工作):

car.ride();

选项B(用户可以访问类内部内容):

if(car.getTires().getUsageLevel()< Car.ACCEPTABLE_TIRE_USAGE)
    for (Wheel w: car:getWheels()){
        w.spin();
    }
}

如果你认为选择A更好,那么恭喜你。你得到了根集合背后的主要原因。


聚合根封装多个类。您只能通过主对象操作整个层次结构。

黛娜:

在存储库上下文中,聚合根是一个没有父实体的实体。它包含零个、一个或多个子实体,这些子实体的存在依赖于父实体的身份。这是存储库中的一对多关系。这些子实体是普通的聚合。

聚合是指某物的集合。 根就像树的顶部节点,从那里我们可以访问网页文档中的<html>节点。 博客类比,一个用户可以有很多帖子,每个帖子可以有很多评论。因此,如果我们获取任何用户,那么它可以作为根访问所有相关的帖子和这些帖子的进一步评论。这些统称为集合或聚合

来自DDD Step By Step(离线):

在一个聚合中有一个聚合根。聚合根为 属性中的所有其他实体和值对象的父实体 聚合。 存储库对聚合根进行操作。

更多信息也可以在这里找到。