我的项目广告商和BonusPrograms有两件事。
业务规则是 - :
广告商将从奖励计划列表中选择奖励计划。
一次只能分配一个奖励计划,之前的奖励计划将被丢弃给该广告商。
BonusPrograms不是由广告商创建的,只是分配给它们。
每个广告客户都不会创建BonusPrograms,它适用于所有广告客户
任何新的奖励计划都可以随时在项目中引入
我的问题是 - :
1)我创建了Bonus程序作为针对广告客户根聚合的单独的agg根,因为广告商不创建它,它只分配它。我是对的吗?
OR
2)我是否在广告商聚合下将BonusPrograms设为valueobject,因为只有一个奖励计划被分配给广告商,当一个新的奖励计划被分配时,前一个被删除?
答案 0 :(得分:1)
我选择3),即BonusProgram是一个实体,但不是聚合根。很难说您不了解您的域名,但是根据您在此处描述的内容,广告(或市场营销或类似的东西)是聚合,而广告商和奖励计划是该聚合下的实体。不知道你所说的聚合根本是什么,但它对我来说听起来不像广告商或奖金计划。
答案 1 :(得分:0)
首先,让我说我同意保罗,你应该在某个时候接受他的回答。我已经对此发表了评论,但我可以更好地表达我的想法。
您在这里提出两个问题,每个问题都有两个常见的粘性概念。
第一个问题是如果广告商是聚合根,则BonusProgram相对于广告商的概念。这绝对是一个有趣的问题,取决于您的域和用例。它不依赖于BP是否是值对象或实体,因为聚合通常包含两者。聚合的要点是简化外部(到聚合根)对象的对象遍历。您可以通过选择一个外部对象可以引用的根实体来实现这一点,并且只有一个(对于用例)。这意味着客户端对象可以引用广告商,但不能引用BonusProgram。广告商将持有BP必要的引用,以满足clinet对象的请求。
第二个问题是BP是价值对象还是实体。答案再次取决于您的域名。总是问自己的问题是你是否关心对象的身份。如果你不在乎,它就是一个价值对象;如果你关心它是一个实体。价值对象的经典案例是金钱 - 虽然你当然关心它,但你通常不关心哪一美元(一美元和另一美元一样美妙)!在这种情况下,BonusProgram更像是一个实体,你可能很有兴趣知道BP上个月生效了什么,以及与本月的BP相比它的结果是什么。
再次,保罗说同样的话,你应该接受他的答案。
HTH,
Berryl