聚合根问题

时间:2010-10-20 14:24:45

标签: design-patterns domain-driven-design

在我的一个项目中,我有一个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; 
    }
}

或者我错过了聚合根的全部意义?有人可以告诉我一些例子,无论如何,聚合根的整个目的是什么。就像一个示例,它向我展示了与一些标准方法相比,聚合根可以实现的目标。一个真实世界的例子,它显示了使用聚合根时解决了哪些确切的设计问题。

感谢。

1 个答案:

答案 0 :(得分:2)

聚合根的主要目标是构造您的对象并定义明确的边界。

我认为 - 其中一个主要好处是它们消除了引用网。状态将始终通过聚合根进行更改,聚合根对其有效性负责。这意味着 - 从上层开始,你需要思考如何只与根相互作用,而你不必考虑它们的内在细节。

  

这应该是聚合根用于什么?

这是AR负责的事情之一 - 验证自己。

  

或者我也可以将地址设为聚合根并使其保留对车库的引用。

人为地创建聚合根并不是一个好主意。在促进实体聚合根之前,您应该仔细考虑。你有更多的根 - 更多的网络参考你会有。如果每个实体都是root用户 - 当你不容易遵循层次结构时,你会回到关系数据库。