审批系统的DDD、DCI应用

用户可以写审请,
提交给另一个用户审批,这个用户可以批准或者否决申请,也可以再转交给另一个用户进行审批

用DDD进行数据模型划分
实体:申请(approval)、用户(role)、审批环节对象(process)
聚合根:申请(approval)

然后用DCI进行场景设计
写申请:bool save(approval model)
提交申请:process commitTo(int roleid)
审批申请:process approve(bool agreement,string commont)

代码实现的话,我没有实用event sourcing方式
把场景都由领域对象(即ApprovalContext类)实现
banq大哥,这样有没有什么问题?

审批系统是一种以动态过程为主的系统,是过程主导数据的产生。

实体是Approval是否代表申请这个过程产生的结果?

因为是以过程为主,场景应该在过程中实现,也就是写申请 提交申请和审批申请这几个服务中实现,不是在领域对象中实现。

2012-05-21 08:43 "@banq"的内容
审批系统是一种以动态过程为主的系统 ...

我设计的出发点是:每个场景都是针对申请这个对象发生的,申请又是这个子系统的聚合根,所以把他们放到这个领域对象里。

如果都使用过程实现,似乎没有了DDD中的聚合根了,呵呵

对不起,我之前将“申请实体”和“审批状态”混合起来了。

你这个审批系统的审批目标是“申请Approval”这个实体,它确实是DDD的实体聚合根,这个实体中可以有一些审批的规则切换,比如如果A流程通过,下一个流程是B或C,如果B流程通过,下面一个流程是C或D或E。

场景还是发生审批服务中,流程切换规则根据实体中的规则进行切换。

不要将场景发生在实体中,这肯定有问题,因为场景是具体怎么干,而实体中放入的都是战略性的抽象,就如同DNA一样,而平时人体内部各种活动发生都是在五脏六腑,而不是在DNA里发生一样,但是都离不开DNA的指导。


[该贴被banq于2012-05-21 14:23修改过]

2012-05-21 14:23 "@banq"的内容
这个实体中可以有一些审批的规则切换 ...

现在我没有做规则切换,属于比较随兴的那种
上级可以结束审批,也可以再把审批转呈,也可以再接着转呈,这些环节中的任何一个人都可以结束审批。

关于DNA的比喻相当精彩,我还需要再领悟一下。