DDD:引用另一个聚合子实体

Dav*_*her 7 entity domain-driven-design transactions aggregate reference

我目前正在深入研究DDD,需要一点点启发.

我有两个实体

  • Temple
  • TempleVariant

Temple(耳机)包含基本信息(名称,描述,...),并有n个变体,其中包含技术说明(CAD绘图,尺寸,...)

我的第一印象是: TempleTempleVariant形成一个聚合 - 它们属于一起:它们似乎非常紧密耦合

  • 如果我删除一个Temple全部TempleVariants应该同样删除
  • TempleVariant没有 Temple(至少没有意义)s 不可能存在

但后来我读到,聚合根之外任何内容不允许引用另一个聚合内的实体.但实际上并没有Temple外部实体引用而是引用TempleVariants.

这是否意味着在(DDD)现实中Temple并且TempleVariant不同的聚合,它们似乎只是一个聚合体?

但是,如果我删除Temple怎么办?正如我所说,TempleVariants也必须删除.但那会违反规则"一次聚合 - 改变 - 一次交易"(或者所谓的:),因为我的"感觉"是我必须在一次交易中删除它们......

所以我的问题是:

  • 两个聚合?
  • 如果是这样:如何处理删除?

Lg
warappa

Gia*_*sio 4

领域模型中的每个类都应该映射您从领域专家那里学到的通用语言。顺便说一句,这看起来是一个非常有趣的领域。

对我来说,有两种不同的途径可以解决您的担忧。

您应该记住,需要聚合来确保业务不变性。也就是说:它们接收改变其状态的命令,并负责避免无效操作(通过适当的异常)。它们通常是实体,因为它们拥有身份。

TempleVariants 作为值对象

如果(且仅当)需要 TempleVariant 实例来处理业务规则时,它们应该是聚合的一部分。也就是说,Temple包含它们。
然而,它们应该是不可变的对象:只有它们Temple可以接收改变其状态的命令(始终作为一个整体)。

在这种情况下,当您删除 Temple 时,所有连接的 TempleVariants 都会消失。尽管如此,在我开发的大多数 DDD 应用程序中,没有实体被删除:它们只是被存档。但我习惯了金融应用程序和域名,也许在您的域名中删除寺庙是正确的做法。

TempleVariant作为 DTO

如果其中没有命令Temple需要任何命令TempleVariant来确保业务规则,则该信件可能只是有用的描述性数据,可以使用映射数据库模式的适当 DTO 进行处理。在这种情况下,我将定义一个基础设施服务,它返回指定Temple.

在这种情况下,您可以公开DTO 中相关项的共享标识符,但这不是必需的。Temple

有关聚合设计的更多信息,我强烈建议您阅读Vernon 的聚合设计文章