如何在域驱动器设计中设计自引用聚合

时间:2016-07-26 14:28:09

标签: domain-driven-design aggregateroot

我在一个任务系统上工作,其中一个任务可以有集合子任务,子任务可以有子任务集合等等(递归)。

DOMAIN

根据task

提供Organizational Chart

示例组织结构图:

Mahdi
---Saeed
------Jaime
------Ahmed
---Tarawneh
------Mae
---Rasheed

组织结构图上的上层人员会将任务分配给他下面的人。

让我们说Mahdi会将任务分配给Saeed,名为prepare course materials for IELTS

然后,赛义德可能会将任务划分为子任务。

prepare course materials for IELTS
---issue laptop and equipment (assigned to Jaime)
---prepare the checklist form(assigned to Ahmed)

然后,如果它真的是一项重大任务,Jaime可能会将其进一步划分为子任务。

根据域专家的说法,它通常低于3级

不变量:

  • 在移动任务的截止日期时,应该检查它是否应该超过其父任务的截止日期
  • 如果任务有子任务,它将基于它们的状态。 (任务将保持挂起状态,直到有一个待处理的子任务......任务将在其所有子任务完成后自动标记为已完成)
  • 如果他们没有子任务,每个单独的任务都可以更新他们的状态

修改

  • 我只能更新分配给我或分配给我的任务状态。
  • 我只能向直接在我这里的员工提供任务

我是否必须坚持使用Task概念,或者仍然存在像MainTask& SubTask(只是一个例子)?

如果我坚持Task概念,我应该加载整个图表还是只加载直接的父母和孩子?

或者我应该将所有工作委托给域名服务吗?哪个可能会把任务变成贫血模型?

1 个答案:

答案 0 :(得分:6)

你应该在Effective Aggregate Design上复习Vaughn Vernon的系列剧。他探索的问题领域与你所描述的有相似之处。

  

在移动任务的截止日期时,应该检查它是否应该超过其父任务的截止日期

如果此不变量失败,业务成本是多少?

如果错误的最后期限是一个必须要防止的昂贵问题,那么您将被迫进入一个设计,其中任务图的所有截止日期都需要包含在单个聚合边界内(因为最终,任务截止日期的所有写入都需要立即与根任务的截止日期一致。)

然而,在写入发生后检测并不是特别困难的条件。如果你可以放松限制 - 允许"无效"最后期限,但实现检测它们并对其进行补救的能力 - 然后,您可以更灵活地设置边界。

您的状态要求中的问题是类似的:如果您需要状态更新立即保持一致,如果您需要在单个事务中将状态更改的写入级联到任务图,那么所有任务状态需要在同一聚合边界内。

如果情况并非如此;如果足以看到子任务已经完成,并在单独的事务中更新父任务状态,那么您可以更灵活地绘制聚合边界。

我的猜测是你要避免为每次写入加载整个任务图。如果所有任务都是同一聚合的一部分,那么您一次只能更新一个任务。立即一致性意味着更多的写入争用;您需要与域专家坐下来,确保每个人都了解哪些对业务更重要。

  
      
  • 我只能更新分配给我或分配给我的任务状态。
  •   
  • 我只能向直接在我这里的员工提供任务
  •   

同样,这对企业真的有价值吗?这真的是您的任务分配上下文的一部分,还是责任属于授权?

您还需要考虑记录簿的内容。如果您的模型是谁向谁报告的权限,那么尝试强制执行报告链的连接任务分配的不变量可能是有意义的。但是,如果像大多数组织一样,报告链是在现实世界中决定的,那么模型实施严格限制因为它的数据副本是陈旧的,真的没有意义。

任务分配可能类似 - 一些经理正在决定委派一些工作,而只是告知系统是这种情况。

在现实世界违反业务规则的情况下,系统应该跟踪,而不是试图假装它不会发生。