我在一个任务系统上工作,其中一个任务可以有集合子任务,子任务可以有子任务集合等等(递归)。
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
概念,我应该加载整个图表还是只加载直接的父母和孩子?
或者我应该将所有工作委托给域名服务吗?哪个可能会把任务变成贫血模型?
答案 0 :(得分:6)
你应该在Effective Aggregate Design上复习Vaughn Vernon的系列剧。他探索的问题领域与你所描述的有相似之处。
在移动任务的截止日期时,应该检查它是否应该超过其父任务的截止日期
如果此不变量失败,业务成本是多少?
如果错误的最后期限是一个必须要防止的昂贵问题,那么您将被迫进入一个设计,其中任务图的所有截止日期都需要包含在单个聚合边界内(因为最终,任务截止日期的所有写入都需要立即与根任务的截止日期一致。)
然而,在写入发生后检测并不是特别困难的条件。如果你可以放松限制 - 允许"无效"最后期限,但实现检测它们并对其进行补救的能力 - 然后,您可以更灵活地设置边界。
您的状态要求中的问题是类似的:如果您需要状态更新立即保持一致,如果您需要在单个事务中将状态更改的写入级联到任务图,那么所有任务状态需要在同一聚合边界内。
如果情况并非如此;如果足以看到子任务已经完成,并在单独的事务中更新父任务状态,那么您可以更灵活地绘制聚合边界。
我的猜测是你要避免为每次写入加载整个任务图。如果所有任务都是同一聚合的一部分,那么您一次只能更新一个任务。立即一致性意味着更多的写入争用;您需要与域专家坐下来,确保每个人都了解哪些对业务更重要。
- 我只能更新分配给我或分配给我的任务状态。
- 我只能向直接在我这里的员工提供任务
同样,这对企业真的有价值吗?这真的是您的任务分配上下文的一部分,还是责任属于授权?
您还需要考虑记录簿的内容。如果您的模型是谁向谁报告的权限,那么尝试强制执行报告链的连接任务分配的不变量可能是有意义的。但是,如果像大多数组织一样,报告链是在现实世界中决定的,那么模型实施严格限制因为它的数据副本是陈旧的,真的没有意义。
任务分配可能类似 - 一些经理正在决定委派一些工作,而只是告知系统是这种情况。
在现实世界违反业务规则的情况下,系统应该跟踪,而不是试图假装它不会发生。