【问题标题】:Recommended way to create aggregate entities创建聚合实体的推荐方法
【发布时间】:2011-01-27 19:21:59
【问题描述】:

假设,我有聚合名称“ABCD”,它是该聚合中的根实体和另一个实体“IJKL”。我的问题是,创建 IJKL 实体并保存在数据库中的推荐方法是什么

【问题讨论】:

  • 您使用 ORM 映射它或使用事件溯源来记录状态变化。
  • 在我的 IABCDRepository 中我可以有类似 public static void SaveIJKL(IJKL ijklObject) 的方法
  • 在我的应用服务层中,我可以使用 void SaveIJKL(IJKL ijklObject) 等方法获得服务

标签: domain-driven-design


【解决方案1】:

根据聚合的定义,IJKL 的生命周期与 ABCD 的生命周期相耦合,因此您不应该明确创建 IJKL;相反,您应该在 ABCD 上调用逻辑,这将决定(内部)如何/何时处理 IJKL(s)。

对于新实例,聚合创建逻辑应封装在工厂中,该工厂将负责与聚合的其余部分一起“更新”IJKL 实例。

对于持久性问题(加载/保存现有实体),逻辑应该是存储库的 SaveABCD 方法的一部分,该方法负责整个聚合的持久性。

如果您始终发现自己需要直接操作 IJKL,那么您的聚合就有问题 - ABCD 不是正确的根,或者 IJKL 需要位于单独的聚合中。

【讨论】:

  • 在我的项目中,我有 Advertiser 实体,它是聚合的根实体,并且在该聚合中有 bonusprogram 实体,bonusprogram 实体(bonusprogram 类似于承诺,例如 -:如果 Advertiser 订阅 bonusprogram A,这意味着广告商必须在一个月内制作 20 个新广告,从而获得 100 美元的奖金,广告商将获得)不是由广告商创建的,但广告商只能从下拉列表中订阅 bonsuprogram。现在如果管理员想在当前的奖励计划列表中添加新的奖励计划,他会怎么做?请记住,他不能对 Advertiser 做到这一点。
猜你喜欢
  • 1970-01-01
  • 2019-08-12
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多