-
21-09-2019 - |
题
我正在尝试了解如何正确使用存储库模式。聚合根的核心概念不断出现。当在网络和 Stack Overflow 上搜索有关什么是聚合根的帮助时,我不断找到有关它们的讨论以及指向应该包含基本定义的页面的死链接。
在存储库模式的上下文中, 什么是聚合根?
解决方案
在存储库模式的上下文中,聚集体的根是唯一从存储库对象客户端代码的负荷。
存储库封装访问到子对象 - 从呼叫者的角度来看,它自动加载它们,或者在同一时间根被装载,或者当他们实际上需要(如,利用迟缓装载)
。例如,可能有它封装在多个Order
对象的操作的LineItem
对象。你的客户端代码永远不会直接加载LineItem
对象,只是包含它们的Order
,这将是您的域的那部分的总根源。
其他提示
从埃文斯DDD:
的聚集体的是,我们把作为数据变化为目的的单元相关联的对象的集群。每个聚集有根和边界。边界定义了什么是骨料内。根包含在AGGREGATE单个特定ENTITY。
和
的根源在于,外部对象可以保持到引用AGGREGATE的唯一成员[。]
这意味着,集料的根是可以从储存库加载的唯一对象。
的一个例子是含有Customer
实体和实体Address
的模型。我们绝不会从模型直接访问Address
实体,因为它不无关联Customer
的背景下才有意义。因此,我们可以说,Customer
和Address
在一起形成聚集体,并且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 的时候是这样。
我们目前正在做一个电子商务平台,我们基本上有两个聚合根:
- 顾客
- 卖家
客户提供联系信息,我们向他们分配交易,交易获取行项目等。
卖家销售产品、有联系人、关于我们的页面、特别优惠等。
这些分别由客户和卖方存储库负责。
<强>汇总表示的东西集合。结果
根就像是树的顶部节点,从这里我们可以访问一切都像在网页文件<html>
节点。结果
博客打个比方,一个用户可以有很多职位和各岗位能够有很多的意见。因此,如果我们取任何用户的,则可以作为根即可访问所有相关的职位和这些职位的进一步评论。这些都一起说是集合或聚合强>
总结是你保护你的不变量,并通过限制其访问强制一致认为聚合根。不要忘了,总应该在你的项目的业务规则和不变量,而不是关系数据库设计。你不应该注入任何资源库,并没有查询是不允许的。
在二郎没有必要,聚集体之间进行区分,而不是OO组合物一旦集合体通过数据结构组成的状态内。看一个例子: https://github.com/bryanhunter/cqrs-with -erlang /树/ NDC-伦敦