2010-06-23 79 views
0

我目前正在确定系统中的实体,值对象和聚合。下面要说的实体已经确定:聚合和值对象:删除?

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

而客户 - >电子邮件是一个多对多的关系,因为是客户 - >地址(含地址类型)。这些关系由CustomerAddress和CustomerEmail关系对象表示。

起初我以为这是直截了当:

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

与客户是包含所有实体的集合的总根源和VO的上面。

我有这个问题(当我向前推进时,这可能只是因为我正在了解聚合的概念)假设您有一个供应商实体使用相同的地址和电子邮件值对象来反映上述客户聚合。在这种情况下,当客户被删除时,地址和电子邮件不应该被删除,作为供应商,甚至另一个客户可能仍然在引用它们。我见过很多文档,说明何时删除聚合,聚合边界内的所有内容都会一次全部删除。我是否正确地认为这不适用于价值对象的总和(即它们是不可变的......如果我们在车辆集合中有一个颜色对象为绿色......您不会仅仅因为一辆汽车而删除颜色被删除),或者电子邮件和地址是否存在自己的实体(和聚合体)作为两个地址,即使它们可能具有相同的属性,也是实际的单独身份(即一个是供应商地址,另一个是客户地址?)如果它们确实是Value Objects,那么如果VO只能通过它们的聚合根进行操作,那么如何去处理它们应该被删除的情况(没有供应商或客户仍然引用地址)?

干杯,

史蒂夫

回答

2

你想在你的数据库的千卡您的域名。这不被推荐。

供应方实体,反映了上述客户总

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

你说“客户 - >电子邮件是多对多的关系”。多个客户共享电子邮件对您的域有意义吗?如果是的话,那么你可能错过了一个概念。检查您的领域专家对此关系有何评论。如果它对于很多人来说并不是很多,但可能比电子邮件是客户实体“拥有”的价值对象。现在,如果客户拥有电子邮件或地址,您可以不加任何限制地将其删除(或采取行动)。

有关DDD最难的事情之一是,你总是最终试图在聚合之间共享实体。别。你打败了一个Aggregate的洞穴点 - 一致性边界。相反,在您的领域专家的帮助下找出将澄清AR之间边界的遗漏概念。

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

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