我正在努力思考如何正确地使用存储库模式。聚合根的核心概念不断出现。当我在web和Stack Overflow上搜索什么是聚合根时,我一直在寻找关于聚合根的讨论,以及指向应该包含基本定义的页面的死链接。
在存储库模式的上下文中,什么是聚合根?
我正在努力思考如何正确地使用存储库模式。聚合根的核心概念不断出现。当我在web和Stack Overflow上搜索什么是聚合根时,我一直在寻找关于聚合根的讨论,以及指向应该包含基本定义的页面的死链接。
在存储库模式的上下文中,什么是聚合根?
当前回答
聚合是通过限制聚合根的访问来保护不变量和强制一致性的地方。不要忘记,聚合应该根据您的项目业务规则和不变量进行设计,而不是数据库关系。不应该注入任何存储库,也不允许进行任何查询。
其他回答
假设你有一个计算机实体,这个实体也不能没有它的软件实体和硬件实体。这些组成了计算机集合,即域的计算机部分的微型生态系统。
聚合根是聚合(在我们的例子中是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(本身没有标识),仅将其视为一个示例。
聚合是指某物的集合。 根就像树的顶部节点,从那里我们可以访问网页文档中的<html>节点。 博客类比,一个用户可以有很多帖子,每个帖子可以有很多评论。因此,如果我们获取任何用户,那么它可以作为根访问所有相关的帖子和这些帖子的进一步评论。这些统称为集合或聚合
聚合是通过限制聚合根的访问来保护不变量和强制一致性的地方。不要忘记,聚合应该根据您的项目业务规则和不变量进行设计,而不是数据库关系。不应该注入任何存储库,也不允许进行任何查询。
在Erlang中,一旦聚合由状态内的数据结构组成,而不是OO组合,就不需要区分聚合。参见示例:https://github.com/bryanhunter/cqrs-with-erlang/tree/ndc-london