Din*_*nah 417 design-patterns ddd-repositories aggregateroot repository-pattern
我试图了解如何正确使用存储库模式.Aggregate Root的核心概念不断涌现.在搜索Web和Stack Overflow以获取有关聚合根的帮助时,我会不断发现有关它们的讨论以及指向应该包含基本定义的页面的死链接.
在存储库模式的上下文中,什么是聚合根?
Jef*_*nal 290
在存储库模式的上下文中,聚合根是客户端代码从存储库加载的唯一对象.
存储库封装了对子对象的访问 - 从调用者的角度来看,它会自动加载它们,无论是在加载根目录还是实际需要它们时(如延迟加载).
例如,您可能有一个Order对多个LineItem对象封装操作的对象.您的客户端代码永远不会LineItem直接加载对象,只Order包含它们,这将是您域的该部分的聚合根.
jas*_*son 195
来自埃文斯DDD:
AGGREGATE是一组关联对象,我们将其视为数据更改的单位.每个AGGREGATE都有一个根和一个边界.边界定义了AGGREGATE中的内容.根是AGGREGATE中包含的单个特定ENTITY.
和:
根是AGGREGATE的唯一成员,允许外部对象保存对[.]的引用.
这意味着聚合根是唯一可以从存储库加载的对象.
一个例子是包含Customer实体和Address实体的模型.我们永远不会Address直接从模型访问实体,因为没有关联的上下文就没有意义Customer.因此,我们可以说,Customer和Address在一起形成聚集体,并且Customer是一个聚合根.
Mar*_*zak 93
聚合根是简单想法的复杂名称.
精心设计的类图封装了它的内部结构.调用访问此结构的点aggregate root.
您的解决方案的内部可能非常复杂,但此层次结构的用户将使用root.doSomethingWhichHasBusinessMeaning().
你想怎么骑车?选择更好的api
选项A(它只是以某种方式工作):
car.ride();
Run Code Online (Sandbox Code Playgroud)
选项B(用户可以访问类inernals):
if(car.getTires().getUsageLevel()< Car.ACCEPTABLE_TIRE_USAGE)
for (Wheel w: car:getWheels()){
w.spin();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您认为选项A更好,那么祝贺.你得到了主要原因aggregate root.
聚合根封装了多个类.您只能通过主对象操纵整个层次结构.
Fra*_*ino 34
想象一下,你有一个计算机实体,这个实体也离不开它的软件实体和硬件实体.这些形成了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 {}
Run Code Online (Sandbox Code Playgroud)
请记住,硬件可能也是一个ValueObject(没有自己的身份),仅作为示例.
Cap*_*chi 14
如果您遵循数据库优先方法,则聚合根通常是1-many关系的1侧的表.
最常见的例子是人.每个人都有许多地址,一张或多张工资单,发票,CRM条目等.情况并非总是如此,但却是9/10倍.
我们目前正在开发一个电子商务平台,我们基本上有两个聚合根:
客户提供联系信息,我们为他们分配交易,交易获取订单项等.
卖家销售产品,联系人,关于我们页面,特别优惠等.
这些由客户和卖方存储库分别处理.
黛娜:
在存储库的上下文中,聚合根是没有父实体的实体.它包含零个,一个或多个子实体,其存在依赖于父对象的身份.这是存储库中的一对多关系.这些儿童实体是普通的聚合体.
小智 6
聚集意味着收集某物。
根就像树的顶部节点,从那里我们可以访问<html>网页文档中的所有节点。
博客类推,一个用户可以有很多帖子,每个帖子可以有很多评论。因此,如果我们获取任何用户,则它可以充当root用户访问所有相关帖子以及这些帖子的进一步评论。这些统称为收集或汇总