Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 聚合根问题_Design Patterns_Domain Driven Design - Fatal编程技术网

Design patterns 聚合根问题

Design patterns 聚合根问题,design-patterns,domain-driven-design,Design Patterns,Domain Driven Design,在我的一个项目中,我有一门车库课 此类包含许多集合,如地址、银行帐户、会员资格等 所有这些集合类都具有有效性。这意味着地址可以在用户指定的时间段内有效。可以添加新地址或银行帐户,但有效期不允许与其他记录的有效期重叠 因此,我所做的是使Garage类成为聚合根。可以通过方法添加地址等。每次添加记录时,我都会检查要添加的记录是否与集合中已存在的其他有效期重叠 像这样: protected internal void AddAddress(Address address)

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

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

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

因此,我所做的是使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");

...
        }
受保护的内部无效地址(地址)
{
检查.要求(新的IsUniqueValiditySpecification(
this.addresses.ToList()).Issatifiedby(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; 
    }
}
公共虚拟有效性
{
获取{返回有效性;}
集合{
检查.要求(新的IsUniqueValiditySpecification(
this.garage.Addresses.ToList()).Issatifiedby(this),
“有效期与现有地址的有效期相交”);
有效性=价值;
}
}
还是我遗漏了聚合根的全部要点?有人能告诉我一些例子,聚合根的全部目的是什么吗。比如一个例子,它向我展示了聚合根与一些标准方法相比可以实现什么。这是一个真实的例子,展示了使用聚合根时解决的确切设计问题


谢谢。

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

在我看来,它们的一个主要好处是消除了网络引用。状态将始终通过聚合根更改,聚合根负责其有效性。这意味着——从更高的层次来看,你需要考虑如何只与根进行适当的交互,而不是被迫考虑它们的内部细节

这就是聚合根的用途吗

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

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

人工创建聚合根不是个好主意。在将实体提升为聚合根之前,应该仔细考虑。你有了更多的根-你会有更多类似网络的参考资料。若每个实体都是根,那个么当你们并没有容易遵循的层次结构时,你们就回到了关系数据库