Domain driven design 价值对象或实体

Domain driven design 价值对象或实体,domain-driven-design,Domain Driven Design,在我的项目中有两件事:广告商和博纳计划 业务规则是-: 广告商将从奖金计划列表中选择奖金计划 一次只能分配一个奖金计划,之前的奖金计划将被该广告客户放弃 BonusPrograms不是由广告客户创建的,只是分配给他们 BonusPrograms不是为每个广告商创建的,而是为所有广告商创建的 任何新的bonusprogram都可以在项目中的任何时候引入 我的问题是-: 1) 我已经创建了奖金计划,作为针对广告商根聚合的单独agg根,因为广告商不创建它,它只分配它。我说的对吗 或 2) 我是否将Bo

在我的项目中有两件事:广告商和博纳计划

业务规则是-:

  • 广告商将从奖金计划列表中选择奖金计划

  • 一次只能分配一个奖金计划,之前的奖金计划将被该广告客户放弃

  • BonusPrograms不是由广告客户创建的,只是分配给他们

  • BonusPrograms不是为每个广告商创建的,而是为所有广告商创建的

  • 任何新的bonusprogram都可以在项目中的任何时候引入

  • 我的问题是-:

    1) 我已经创建了奖金计划,作为针对广告商根聚合的单独agg根,因为广告商不创建它,它只分配它。我说的对吗


    2) 我是否将BonuProgram作为Advertiser Aggregate下的valueobject,因为只有一个BonuProgram被分配给广告商,当一个新的BonuProgram被分配时,前一个被删除?

    我会选择选项3),即BonuProgram是一个实体,而不是聚合根。很难说w/o对你的领域了解得更多,但从你在这里描述的内容来看,广告(或营销,或类似的东西)是聚合,广告商和奖金计划是聚合下的实体。从你所说的话来看,我不确定聚合的根是什么,但对我来说,这听起来既不像广告商也不像奖金计划。

    首先,让我说我同意保罗的观点,你应该在某个时候接受他的回答。我本想对此发表评论,但我可以用这种方式更好地表达我的想法

    你在这里问了两个问题,每个问题都有两个常见的棘手的概念

    第一个问题是,如果广告客户是一个聚合根,那么BonusProgram对于广告客户的作用是什么。这绝对是一个有趣的问题,取决于您的领域和用例。但这并不取决于BP是一个值对象还是一个实体,因为聚合通常包含这两者。聚合的目的是简化外部(到聚合根)对象的对象遍历。您可以通过选择一个外部对象可以引用的根实体(对于用例)来实现这一点。这意味着客户端对象可以引用广告客户,但不能引用BonuProgram。广告客户将持有必要的BP参考资料,以满足客户对象的要求

    第二个问题是BP是值对象还是实体。同样,答案取决于你的领域。始终要问自己的问题是,您是否关心对象的标识。如果你不在乎,它就是一个价值对象;如果你真的在乎,它就是一个实体。价值对象的经典案例是金钱——虽然你当然关心它,但你通常不关心哪一美元是哪一美元(一美元和另一美元一样美妙)!不过在这种情况下,BonusProgram闻起来更像一个实体,你可能很有兴趣知道上个月哪个BP有效,与本月的BP相比,它的结果是什么

    同样,保罗也在说同样的话,你应该接受他的回答

    HTH,

    Berryl

    广告商是根聚合,这是肯定的,但我对奖金计划感到困惑。Bonusprograms是指广告主如果选择任何bonusprogram,他必须做一些承诺,当承诺结束时,根据承诺奖金。既然广告商并没有创建只分配给它的bonusprogram,那个么我就把奖金计划作为单独的根聚合,正如我已经说过的。聚合可能有许多实体,而不仅仅是聚合根。从你所说的奖金计划来看,它听起来不够充实,不足以成为我自己的聚合。那么告诉我,如果明天我必须在数据库中添加任何新的bonusprogram,在不将bonusprogram作为根agg的情况下,我该如何做,因为请记住,广告客户并不创建bonusprogram,它只将自己分配给它,广告客户也是根实体。由于您共享的模型很少,所以很难全面回答。如果你确定你没有错过一个同时负责广告商和BonuProgram的模型,那么你仍然可以拥有一个BonuProgram工厂或类似的工厂,为广告商创建新的奖金计划,并保留相同的聚合根。我仍然认为,有人负责向广告客户分配奖金计划,而且“东西”比广告客户更接近总根。但很多这都是判断,不是硬性的,但我认为工厂是每个根的集合,这里广告商是根的集合,而且他不能创造博纳程序。我唯一关心的是,如果我需要一个新的bonusprogram,我将如何创建它们