价值对象或实体

时间:2011-01-24 18:12:41

标签: domain-driven-design

我的项目广告商和BonusPrograms有两件事。

业务规则是 - :

  1. 广告商将从奖励计划列表中选择奖励计划。

  2. 一次只能分配一个奖励计划,之前的奖励计划将被丢弃给该广告商。

  3. BonusPrograms不是由广告商创建的,只是分配给它们。

  4. 每个广告客户都不会创建BonusPrograms,它适用于所有广告客户

  5. 任何新的奖励计划都可以随时在项目中引入

  6. 我的问题是 - :

    1)我创建了Bonus程序作为针对广告客户根聚合的单独的agg根,因为广告商不创建它,它只分配它。我是对的吗?

    OR

    2)我是否在广告商聚合下将BonusPrograms设为valueobject,因为只有一个奖励计划被分配给广告商,当一个新的奖励计划被分配时,前一个被删除?

2 个答案:

答案 0 :(得分:1)

我选择3),即BonusProgram是一个实体,但不是聚合根。很难说您不了解您的域名,但是根据您在此处描述的内容,广告(或市场营销或类似的东西)是聚合,而广告商和奖励计划是该聚合下的实体。不知道你所说的聚合根本是什么,但它对我来说听起来不像广告商或奖金计划。

答案 1 :(得分:0)

首先,让我说我同意保罗,你应该在某个时候接受他的回答。我已经对此发表了评论,但我可以更好地表达我的想法。

您在这里提出两个问题,每个问题都有两个常见的粘性概念。

第一个问题是如果广告商是聚合根,则BonusProgram相对于广告商的概念。这绝对是一个有趣的问题,取决于您的域和用例。它不依赖于BP是否是值对象或实体,因为聚合通常包含两者。聚合的要点是简化外部(到聚合根)对象的对象遍历。您可以通过选择一个外部对象可以引用的根实体来实现这一点,并且只有一个(对于用例)。这意味着客户端对象可以引用广告商,但不能引用BonusProgram。广告商将持有BP必要的引用,以满足clinet对象的请求。

第二个问题是BP是价值对象还是实体。答案再次取决于您的域名。总是问自己的问题是你是否关心对象的身份。如果你不在乎,它就是一个价值对象;如果你关心它是一个实体。价值对象的经典案例是金钱 - 虽然你当然关心它,但你通常不关心哪一美元(一美元和另一美元一样美妙)!在这种情况下,BonusProgram更像是一个实体,你可能很有兴趣知道BP上个月生效了什么,以及与本月的BP相比它的结果是什么。

再次,保罗说同样的话,你应该接受他的答案。

HTH,
Berryl