0

我目前正在确定系统中的实体、值对象和聚合。假设已识别以下实体:

客户、客户电子邮件、电子邮件、客户地址、地址、地址类型

其中客户 -> 电子邮件是多对多关系,客户 -> 地址(具有地址类型)也是如此。这些关系由 CustomerAddress 和 CustomerEmail 关系对象表示。

最初我认为这是直截了当的:

实体:Customer、CustomerEmail、CustomerAddress 值对象:Email、Address、AddressType

客户是包含上述所有实体和 VO 的聚合的聚合根。

我遇到的问题(这可能只是因为我正在学习聚合的概念)假设您有一个供应商实体,它使用相同的地址和电子邮件值对象反映上述客户聚合。在这种情况下,当客户被删除时,不应删除地址和电子邮件,因为作为供应商,甚至其他客户可能仍在引用它们。我已经看到很多文档表明,当一个聚合被删除时,聚合边界内的所有内容都会被一次性删除。我是否正确地假设这不适用于聚合中的值对象(即它们是不可变的......如果我们在车辆聚合中有一个绿色的颜色对象......你不会因为汽车而删除颜色被删除)或者电子邮件和地址是否应该有自己的实体(和聚合)作为两个地址,

最后,如果它们确实是价值对象,那么如果 VO 只能通过它们的聚合根进行操作,那么如何处理应该删除它们的情况(没有供应商或客户仍然引用地址)?

干杯,

史蒂夫

4

1 回答 1

2

您正在考虑数据库中的域。不建议这样做。

反映上述客户聚合的供应商实体

这表明您在您的领域中缺少一个概念。这个“镜像”对您的领域专家意味着什么?如果它们之间确实存在关系,则应该对其进行显式建模。

您说“客户-> 电子邮件是多对多关系”。多个客户共享一封电子邮件对您的域有意义吗?如果是的话,你可能又错过了一个概念。检查您的领域专家对这种关系的看法。如果不是多对多而是一对多,那么电子邮件可能是客户实体“拥有”的价值对象。现在,如果客户拥有电子邮件或地址,您可以不受任何限制地删除它(或对其采取行动)。

DDD 最困难的事情之一是您最终总是试图在聚合之间共享实体。不。您击败了聚合的漏洞点 - 一致性边界。相反,在您的领域专家的帮助下,确定将澄清 AR 之间界限的缺失概念。

我知道这听起来很抽象(我过去曾问过这样的问题),但事实是,只有您的领域专家才能帮助您更好地为领域建模。

作为最后的建议 - 重新(-re X 100)阅读埃里克埃文斯的书通常会有所帮助:)

于 2011-05-05T07:48:58.627 回答