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

Reference DDD:引用另一个聚合子实体,reference,transactions,domain-driven-design,entity,aggregate,Reference,Transactions,Domain Driven Design,Entity,Aggregate,我目前正在深入研究DDD,需要一些启发 我有两个实体 Temple TempleVariant 太阳穴(听筒)包含基本信息(名称、说明等),并有n个变体,这些变体具有技术说明(CAD图纸、尺寸等) 我的第一印象是: Temple和TempleVariant形成一个聚合-它们属于一起: 他们似乎紧密地结合在一起 如果我删除了一个TempleallTempleVariants,那么同样应该删除 TempleVariants如果没有Temple,就无法生存(至少它没有意义) 但是后来我读到,聚

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

我有两个实体

  • Temple
  • TempleVariant
太阳穴
(听筒)包含基本信息(名称、说明等),并有n个变体,这些变体具有技术说明(CAD图纸、尺寸等)

我的第一印象是:
Temple
TempleVariant
形成一个聚合-它们属于一起: 他们似乎紧密地结合在一起

  • 如果我删除了一个
    Temple
    all
    TempleVariant
    s,那么同样应该删除
  • TempleVariant
    s如果没有
    Temple
    ,就无法生存(至少它没有意义)
但是后来我读到,聚合根之外没有任何内容可以引用另一个聚合中的实体。但是实际上,不是
寺庙
被外部实体引用
,而是

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

但是,如果我删除
Temple
,会怎么样?正如我所说的
TempleVariant
s也必须删除。但这将违反“一个聚合更改-一个事务”(或其名称:)的规则,因为我的“感觉”是我必须在一个事务中删除它们

因此,我的问题是:
  • 这是两个集合吗
  • 如果是:如何处理删除
Lg

warappa

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

对我来说,有两条不同的途径来解决你的担忧

您应该记住,聚合是确保业务不变量所必需的。 也就是说:他们接收到改变其状态的信息,他们有责任避免无效操作(通过适当的方式)。 他们往往是实体,因为他们拥有一个身份

TempleVariant
s作为值对象

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

在本例中,删除庙宇时,所有连接的TempleVariant都将消失。尽管如此,在我开发的大多数DDD应用程序中,没有实体被删除:它们只是存档。但我已经习惯了金融应用程序和域,可能在你的域中删除庙宇是正确的做法

TempleVariant
s作为DTO

如果
Temple
中没有命令需要任何
TempleVariant
来确保业务规则,那么字母可能只是有用的描述性数据,可以通过映射DB模式的正确DTO进行处理。在本例中,我将定义一个Infrastructure services,它返回指定
庙宇的所有变体

在这种情况下,您可以在DTO中公开相关的
庙宇
,但这不是必需的


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

违反的规则和MikeSW关于“真实世界”中行为的问题让我重新思考我的方法。在与领域专家交谈后,我意识到我的方法与领域不匹配,因此违反了ddd。我目前正在重新设计我的模型

@问题: 如果我把
TempleVariant
s放在
Temple
模型中,我会使用“相对于其父代的身份””方法来引用变体(正如MattDavey所建议的)但设计中更重要的错误仍然存在。

如果基本设计是正确的,我会将这两个分别作为聚合根。(从我的角度来看)它会起作用,但它会再次覆盖一个设计错误(至少在我的情况下)

一般来说,我认为,如果违反了ddd规则,最好退后一步
回顾实际业务,检查您拥有的内容是否与您的领域匹配


谢谢你的帮助

一个
TempleVariant
拥有自己独特的身份有意义吗?相反,我会让它的身份相对于它的父母,例如
Temple 12345,变体2
。我们需要更多关于Temple和TempleVariants的信息,更准确地了解他们在“真实世界”中的行为方式。@MattDavey:这是一种可能的方式,尽管我现在还没有这种“技术”的经验。。。