【问题标题】:Aggregate Root question聚合根问题
【发布时间】:2010-10-20 14:24:44
【问题描述】:

在我的一个项目中,我有一个车库课程。

该类包含许多集合,例如地址、银行帐户、会员资格等。

所有这些集合类都具有有效性。这意味着地址可以在用户指定的时间段内有效。可以添加新的地址或银行账户,但有效期不允许与其他记录的有效期重叠。

所以,我所做的是让 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; 
    }
}

还是我错过了聚合根的全部意义?有人可以告诉我一些例子,聚合根的全部目的是什么。就像一个示例,它向我展示了与某些标准方法相比聚合根可以完成的工作。一个真实的例子,展示了使用聚合根解决了哪些确切的设计问题。

谢谢。

【问题讨论】:

    标签: design-patterns domain-driven-design


    【解决方案1】:

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

    在我看来 - 主要好处之一是它们消除了参考网络。状态总是会通过聚合根来改变,聚合根负责它的有效性。这意味着 - 从上层开始,您需要考虑如何仅与根进行适当的交互,而不必考虑它们的内部细节。

    这就是聚合根的用途吗?

    这是 AR 的职责之一 - 验证自己。

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

    人为地创建聚合根不是一个好主意。在将实体提升为聚合根之前,您应该仔细考虑。你得到了更多的根——你将拥有更多的类似网络的参考资料。如果每个实体都将是根 - 当您无法轻松遵循层次结构时,您将返回关系数据库。

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 2015-01-04
      • 2011-04-26
      • 2018-07-15
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多