制作这种聚合根设计是否有意义?

时间:2014-02-04 10:52:06

标签: domain-driven-design aggregateroot

让我们假设一个项目展示这些规范:

  • 每个Employee可以组织Meeting邀请其他Employee个。{/ li>
  • 每个Employee都可以接受邀请参加Meeting,但不会超过最大Participation个。
  • Manager创作者的任何Employee都可以随时取消Meeting
IMO,不变量是:

  • 会议exists只要创建者(Employee)存在(未删除或标记为已删除)。
  • 任何时候都不应该Meeting包含一些优先于预期限制的参与者。
  • 取消其已创建的Employee的任何Meeting都应该取消/删除此Participation
  • Manager取消Employee的{​​{1}}时,MeetingMeeting都应删除。

我应该做:

  • Participation聚合根,包含其创建的Employee的集合。
  • Meeting因此是Meeting的内部实体,包含Employee s的集合。
  • Manager作为另一个Aggregate Root,包含其Participation s。
  • 的集合

因此只会聚集根源: EmployeeEmployee
实际上,经理可能被解雇,然后不是Manager的不变量的一部分,反之亦然。

详情:
_ Employee将提供方法Employee,封装检查重要规则,例如是否超过参与者的最大数量。
_ createParticipation还会提供工厂来创建Employee,以便始终将正确的Meeting分配给EmployeeId
_只会创建两个存储库:MeetingEmployeeRepository,避免直接访问相应的内部部件。
(仅涉及创作,删除类似)

因此,为了创建ManagerRepository的{​​{1}},我的入口点将是我通过Meeting检索的创建者(Participation)。

遵循严格的DDD练习是否有意义?

1 个答案:

答案 0 :(得分:3)

您的员工聚合太大了。这会产生并发问题。如果两名员工同时接受邀请,会发生什么?一个事务将被回滚,因为它们尝试修改相同的聚合。除非你设计了一些花哨的冲突解决逻辑。

相反,请将参与和会议视为单独的聚合。