聚合和值对象:删除?

时间:2010-06-23 03:25:40

标签: domain-driven-design entity aggregate root value-objects

我目前正在确定系统中的实体,价值对象和聚合。说以下实体已被确定:

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

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

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

实体:Customer,CustomerEmail,CustomerAddress 值对象:电子邮件,地址,地址类型

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

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

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

干杯,

史蒂夫

1 个答案:

答案 0 :(得分:2)

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

  

反映上述客户汇总的供应商实体

这表明您在域中遗漏了一个概念。这种“镜像”对您的域名专家意味着什么?如果它们之间确实存在关系,则应明确建模。

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

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

我知道这听起来很抽象(我过去曾经问过这样的问题)但事实是只有你的领域专家可以帮助你更好地模拟领域。

作为最后一条建议 - 阅读埃里克·埃文斯的书,重读(-re X 100)通常有助于:)