在我的一个项目中,我有一个Garage类。
此类包含许多集合,如地址,BankAccounts,成员资格等。
所有这些集合类都有效。意味着地址可以在用户指定的时间段内有效。可以添加新地址或银行帐户,但不允许有效期与其他记录的有效期重叠。
所以,我所做的就是让Garage类成为聚合根。可以通过方法添加地址等。每次添加记录时,我都会检查要添加的记录是否与已经在集合中的其他有效期重叠。
像这样:
protected internal void AddAddress(Address address)
{
Check.Require(new IsUniqueValiditySpecification<Address>(
this.addresses.ToList()).IsSatisfiedBy(address),
"The validity period intersects with the one of an existing address");
...
}
这应该是聚合根用于什么?或者我也可以将地址作为聚合根并使其保持对车库的引用。然后,每次设置有效性时,我都可以执行以下操作:
public virtual Validity Validity
{
get { return validity; }
set {
Check.Require(new IsUniqueValiditySpecification<Address>(
this.garage.Addresses.ToList()).IsSatisfiedBy(this),
"The validity period intersects with the one of an existing address");
validity = value;
}
}
或者我错过了聚合根的全部意义?有人可以告诉我一些例子,无论如何,聚合根的整个目的是什么。就像一个示例,它向我展示了与一些标准方法相比,聚合根可以实现的目标。一个真实世界的例子,它显示了使用聚合根时解决了哪些确切的设计问题。
感谢。
答案 0 :(得分:2)
聚合根的主要目标是构造您的对象并定义明确的边界。
我认为 - 其中一个主要好处是它们消除了引用网。状态将始终通过聚合根进行更改,聚合根对其有效性负责。这意味着 - 从上层开始,你需要思考如何只与根相互作用,而你不必考虑它们的内在细节。
这应该是聚合根用于什么?
这是AR负责的事情之一 - 验证自己。
或者我也可以将地址设为聚合根并使其保留对车库的引用。
人为地创建聚合根并不是一个好主意。在促进实体聚合根之前,您应该仔细考虑。你有更多的根 - 更多的网络参考你会有。如果每个实体都是root用户 - 当你不容易遵循层次结构时,你会回到关系数据库。