【问题标题】:Are entity classes exclusive to one aggregate实体类是一个聚合独有的吗
【发布时间】:2015-03-04 11:51:35
【问题描述】:

在阅读了 Evans 和 Vernon 之后,我还有一个基本问题。 我知道当然一个实体(实例)只能在一个聚合中。 但是一个实体类可以在多个聚合(类)中使用吗? 为了澄清,我在课堂上问。 其他表述:两个不同的聚合根类(!)可以聚合同一个实体类吗?当然,任何实体实例都必须只属于两个聚合根类之一的一个实例。 对于值对象类,这似乎是可能的。至少我的印象是,例如“金钱”的值对象类可以用于不同的聚合类型。

【问题讨论】:

    标签: domain-driven-design


    【解决方案1】:

    正如您正确指出的那样,实体实例不应该在聚合之间共享,因为一个聚合不会知道通过另一个聚合对实体所做的更改,并且无法强制执行其不变量.

    实体理论上可以在 2 个聚合之间共享,但是,根据相同的推理,只有当聚合中的实体实例集与另一个不相交时。这引发了一些问题:

    • 你为什么首先想要那个?如果同一个类的实例有两大类,这不是说明存在两个语义不同的概念,每个概念都应该有自己的类,或者至少是子类吗?

    • 如何防止在运行时(错误)或编程时(未受过教育的开发人员决策)将属于一个聚合的实体实例添加到另一个聚合中?

    值对象避免了这些问题,因为它们通常是不可变的或被视为不可变的——你不修改一个 VO,你修改它的父实体,以便它指向一个全新的 VO 实例。此外,由于值对象没有标识,因此说“相同”的 VO 同时存在于两个聚合中也没有多大意义。因此,您可以在不同的聚合类中安全地重用 VO 类型。

    【讨论】:

    • 可能就这么简单...如果您发现一个实体必须由多个聚合根 (AR) 持有,您可能刚刚发现您的实体实际上应该是一个 AR; )
    • 当然,感谢您指出这一点 :) 尽管有时也可以将其改为值对象。
    • 我明白你的观点并同意。对于不同的聚合,至少应该有不同的子类。我解释你的回答,这样可以吗?也许我应该改写或提出一个关于实体类继承和聚合根的新问题。我不确定拥有聚合根基类和实体基类以及几个子类是否可以有效地对整个聚合进行继承。
    • 像往常一样,这取决于您的域。然而,正如@plalx 所说,90% 左右的时间意味着有一个隐藏的聚合根等待提升,所以我宁愿这样看。根据我的经验,实体子类极为罕见。
    • 实体不能在 AR 之间共享。如果您想要聚合 X 中的信息,该信息是聚合 Y 中的一个实体,请在聚合 X 中使用具有此聚合所需特定信息的值对象,而这些信息又带有来自聚合 Y 中实体的部分值。
    【解决方案2】:

    我认为 Udi 的博文非常相关 - 他建议实体不仅可以是多个聚合的一部分,而且本身也可以是聚合根。让你的脑袋转转有点有趣! http://udidahan.com/2009/06/29/dont-create-aggregate-roots/

    【讨论】:

    • 那是一篇非常有趣的帖子,也是一个有价值的想法(有意义的地方)。请注意 Udi 有点混淆了术语(DDD 中的敏感主题,哈哈)。其中聚合根通常定义了实体图中的根实体,定义了我们加载、存储和操作的完整单元,这样我们就可以保证一致性,Udi是在谈论其他东西,并且可以说应该选择一个不同的术语。他在谈论在给定用例中哪个对象是主题,即用例开始的对象,它产生新的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多