2016-07-26 50 views
1

IM在任务系统,其中一个任务可以有集合的子任务和子任务可以有子任务收集等(递归)的工作。如何设计自参考聚集在域驱动设计

DOMAIN

task基于Organizational Chart

示例组织结构图给出:

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

在组织结构图上的人将在他分配任务的人。

比方说马赫迪将指派任务赛义德命名prepare course materials for IELTS

然后Saeed可能会将任务分成子任务。

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

然后在情况下,它确实是一个大课题,海梅可能会进一步将其划分为子任务。

按领域的专家,其通常在3levels

不变:

  • 移动任务的最后期限时,应检查其不应超过其父任务的最后期限
  • 如果该任务具有子任务,它将基于它们的状态。 (任务将保持等待,直到有一个未完成的一个子任务....任务会完成时所有的子任务完成后自动标记)
  • 如果他们没有分每一个人任务可以更新自己的状态任务

编辑

  • 我只能更新已分配给我的任务状态或我指定给。
  • 我只能给那些直属我

任务的工作人员我一定要坚持使用Task概念或有概念,即时通讯仍然缺少像MainTask的& SubTask类(只是一个例子)?

如果我将坚持Task概念,我应该加载整个图形或仅直接父母和孩子?

,或者我应该只是委托的各项工作,以一个域名服务?这可能会将任务转变为贫血模型?

+0

这里有一个业务流程,有一堆场景,它不仅仅是一个聚合的业务案例。乍一看,“Task”概念似乎也可以用作其他任务的分组标准。您需要在每种情况下确定每个业务案例和“Task”的正确集合及其结果(相关的** Event **),然后将它们“链接”为场景。这不是微不足道的。 – MikeSW

+0

@Daskul你的问题是什么?您的域模型到目前为止看起来如何? – guillaume31

+0

@MikeSW你能帮我找出一些除了任务以外的更多概念吗?我认为自任务总是直接在上面,我不必加载整个图。只有直接的父母和孩子。 –

回答

5

您应该查看沃恩弗农的一系列Effective Aggregate Design;他所探讨的问题领域与您所描述的相似。

移动任务的最后期限时,应检查其不应超过其父任务

是什么,如果这不变的失败成本,业务的最后期限?

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

但是,在写入发生后,这不是检测特别困难的条件。如果您可以放宽限制 - 允许“无效”最后期限,但实施检测并补救它们的能力 - 那么在您放置边界的位置您将拥有更大的灵活性。

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

如果情况并非如此;如果足以发现子任务已完成,并在单独的事务中更新父任务状态,那么您在绘制聚合边界的位置具有更大的灵活性。

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

  • 我只能更新分配给我或我分配给的任务状态。
  • 我只能给那些直属我

同样,这是否真的有商业价值的任务的工作人员?这是否是您的任务分配环境的一部分,还是责任属于授权?

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

任务分配可能类似 - 有些经理正在决定委托某项工作,而仅仅是通知系统。

在这些情况下,如果现实世界违反了商业规则,那么系统应该跟踪它,而不是试图假装它不会发生。

+1

如果我将继续最终的一致性路径。那么我应该将这项工作委托给域服务吗?顺便说一句,我已经对我的帖子进行了编辑,我有时间审阅它。 –