我正在尝试了解如何正确使用存储库模式。聚合根的核心概念不断出现。当在网络和 Stack Overflow 上搜索有关什么是聚合根的帮助时,我不断找到有关它们的讨论以及指向应该包含基本定义的页面的死链接。

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

有帮助吗?

解决方案

在存储库模式的上下文中,聚集体的根是唯一从存储库对象客户端代码的负荷。

存储库封装访问到子对象 - 从呼叫者的角度来看,它自动加载它们,或者在同一时间根被装载,或者当他们实际上需要(如,利用迟缓装载)

例如,可能有它封装在多个Order对象的操作的LineItem对象。你的客户端代码永远不会直接加载LineItem对象,只是包含它们的Order,这将是您的域的那部分的总根源。

其他提示

从埃文斯DDD:

  

的聚集体的是,我们把作为数据变化为目的的单元相关联的对象的集群。每个聚集有根和边界。边界定义了什么是骨料内。根包含在AGGREGATE单个特定ENTITY。

  

的根源在于,外部对象可以保持到引用AGGREGATE的唯一成员[。]

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

的一个例子是含有Customer实体和实体Address的模型。我们绝不会从模型直接访问Address实体,因为它不无关联Customer的背景下才有意义。因此,我们可以说,CustomerAddress在一起形成聚集体,并且Customer是聚集根。

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


一般想法

精心设计类图封装它的内部。通过访问该结构点称为aggregate root

您的解决方案的内幕可能是非常复杂的,但是这个层次的用户只需要使用root.doSomethingWhichHasBusinessMeaning()


实施例

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

如何你想坐你的车吗?选择更好API

选项A(它只是在某种程度上作品):

car.ride();

选项B(用户有权访问类inernals):

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

如果你认为选择一个更好那么恭喜。你落后aggregate root主要原因。


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

想象一下,你有一台计算机的实体,这个实体也不能没有它的软件实体与硬件实体。这些构成了Computer骨料,微型生态系统的域的计算机部。

聚合根是骨料内母舰实体(在本例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(没有对自己的身份),把它作为唯一的一个例子。

如果遵循数据库优先方法,则聚合根通常是一对多关系中第 1 方的表。

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

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

  1. 顾客
  2. 卖家

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

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

这些分别由客户和卖方存储库负责。

来自一个 损坏的链接:

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

存储库在聚合根上运行。

还可以找到更多信息 这里.

黛娜:

在一个储存库的语境中的聚合根是一个实体没有父实体。它包含零,一个或多个子实体,其存在依赖于它的身份父。这是一到库中存储的一对多的关系。那些子实体是纯聚集体。

<强>汇总表示的东西集合。结果 就像是树的顶部节点,从这里我们可以访问一切都像在网页文件<html>节点。结果 博客打个比方,一个用户可以有很多职位和各岗位能够有很多的意见。因此,如果我们取任何用户的,则可以作为即可访问所有相关的职位和这些职位的进一步评论。这些都一起说是集合或聚合

总结是你保护你的不变量,并通过限制其访问强制一致认为聚合根。不要忘了,总应该在你的项目的业务规则和不变量,而不是关系数据库设计。你不应该注入任何资源库,并没有查询是不允许的。

在二郎没有必要,聚集体之间进行区分,而不是OO组合物一旦集合体通过数据结构组成的状态内。看一个例子: https://github.com/bryanhunter/cqrs-with -erlang /树/ NDC-伦敦

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top