Domain driven design 聚合和值对象:是否删除?

Domain driven design 聚合和值对象:是否删除?,domain-driven-design,entity,aggregate,root,value-objects,Domain Driven Design,Entity,Aggregate,Root,Value Objects,我目前正在确定系统中的实体、值对象和聚合。假设已确定以下实体: 客户,客户邮件,电子邮件,客户地址,地址,地址类型 其中客户->电子邮件是一种多对多关系,客户->地址(具有地址类型)也是如此。这些关系由CustomerAddress和CustomerMail关系对象表示 起初我认为这是直截了当的: 实体:客户、客户邮件、客户地址 值对象:电子邮件、地址、地址类型 客户是包含上述所有实体和VO的聚合的聚合根 我遇到的问题(这可能是因为我在继续学习聚合的概念)是说,您有一个供应商实体,它使用相同的地

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

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

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

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

实体:客户、客户邮件、客户地址 值对象:电子邮件、地址、地址类型

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

我遇到的问题(这可能是因为我在继续学习聚合的概念)是说,您有一个供应商实体,它使用相同的地址和电子邮件值对象反映上述客户聚合。在这种情况下,当客户被删除时,地址和电子邮件不应被删除,因为供应商,甚至其他客户可能仍在引用他们。我看过很多文档,它们建议在删除聚合时,聚合边界内的所有内容都将立即删除。我是否正确地假设这不适用于聚合中的值对象(即,它们是不可变的…如果我们在车辆聚合中有一个绿色的颜色对象…你不会仅仅因为一辆车被移除就删除颜色),或者电子邮件和地址应该有自己的实体(和聚合)作为两个地址,尽管它们可能具有相同的属性,但实际的独立身份(即一个是供应商地址,另一个是客户地址?)

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

干杯


Steve

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

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

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

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

关于DDD最困难的事情之一是,您总是试图在聚合之间共享实体。不要。您将破坏聚合的孔点-一致性边界。相反,在您的领域专家的帮助下,确定缺失的概念,以澄清ARs之间的界限

我知道这一切听起来都很抽象(我以前也问过类似的问题),但事实是,只有你的领域专家才能帮助你更好地对领域建模

最后一条建议是——阅读埃里克·埃文斯的书通常会有所帮助:)