什么是聚合根?

我试图让我的头在如何正确使用存储库模式。 总根的核心概念不断涌现。 当searchWeb和Stack Overflow以获得有关聚合根目录的帮助时,我一直在寻找关于它们的讨论以及应该包含基本定义的页面的死链接。

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

在存储库模式的上下文中,聚合根是您的客户端代码从存储库加载的唯一对象。

存储库封装了对子对象的访问 – 从调用者的angular度来看,它会自动加载它们,或者同时加载根或者实际需要它们(如延迟加载)。

例如,您可能有一个Order对象,它封装了多个LineItem对象上的操作。 您的客户端代码将永远不会直接加载LineItem对象,只是包含它们的Order将成为您的域的该部分的聚合根。

从Evans DDD:

AGGREGATE是一组关联的对象,我们将其作为一个单位来处理数据更改。 每个AGGREGATE都有一个根和一个边界。 边界定义了AGGREGATE内部的内容。 根是AGGREGATE中包含的一个单一的,具体的实体。

和:

根是外部对象被允许保持对[。]的引用的唯一成员

这意味着聚合根是唯一可以从存储库加载的对象。

一个示例是包含Customer实体和Address实体的模型。 我们永远不会直接从模型访问Address实体,因为没有关联Customer的上下文是没有意义的。 所以我们可以说CustomerAddress一起形成一个聚合,而Customer是一个聚合根。

聚合根是一个复杂的名称为简单的想法。


大概的概念

精心devise的类图封装了它的内部。 通过其访问此结构的点称为aggregate root

在这里输入图像描述

你的解决scheme的内部可能是非常复杂的,但是这个层次的用户只会使用root.doSomethingWhichHasBusinessMeaning()


检查这个简单的类层次 在这里输入图像描述

你想怎么骑你的车? select更好的API

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

 car.ride(); 

选项B(用户可以访问课程内部信息):

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

如果您认为选项A更好,那么恭喜。 你会得到aggregate root主要原因。


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

想象一下,你有一个计算机实体,这个实体也不能没有它的软件实体和硬件实体。 这些形成Computer聚合,域的计算机部分的迷你生态系统。

Aggregate Root是聚合内部的母体实体(在我们的例子中是Computer ),通常的做法是让你的存储库只和聚合根实体一起工作,这个实体负责初始化其他实体。

考虑聚合根作为聚集的入口点。

在C#代码中:

 public class Computer : IEntity, IAggregateRoot { public Hardware Hardware { get; set; } public Software Software { get; set; } } public class Hardware : IEntity { } public class Software : IValueObject { } public class Repository<T> : IRepository<T> where T : IAggregateRoot {} 

请记住,硬件也可能是一个ValueObject(没有自己的身份),认为这只是一个例子。

如果遵循数据库优先的方法,那么聚合根通常是一对关系中的一边的表。

最常见的例子是一个人。 每个人都有很多地址,一张或多张工资单,发票,CRM条目等等。并不总是这样,而是9/10倍。

目前我们正在开发电子商务平台,基本上有两个聚合根源:

  1. 顾客
  2. 卖家

客户提供联系信息,我们为他们分配交易,交易获得订单项等。

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

这些由客户和卖方信息库分别处理。

从一个断开的链接 :

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

存储库对聚合根进行操作。

更多信息也可以在这里find。

黛娜:

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

在这里输入图像描述

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

聚合意味着收集的东西。
就像树顶节点,从那里我们可以访问网页文件中的<html>节点的所有内容。
博客类比,用户可以有很多post,每个post可以有很多评论。 所以如果我们获取任何用户,那么它可以作为访问所有相关的职位和这些职位的进一步评论。 这些都是一起说是收集或聚合

Aggregate是你保护你的不变式的地方,通过限制它的访问思想聚合根来强制一致性。 不要忘记,聚合应该devise你的项目业务规则和不variables,而不是数据库关系。 你不应该注入任何存储库,不允许查询。