审批系统的DDD、DCI应用 12-05-20 liyao0409 用户可以写审请,提交给另一个用户审批,这个用户可以批准或者否决申请,也可以再转交给另一个用户进行审批用DDD进行数据模型划分实体:申请(approval)、用户(role)、审批环节对象(process)聚合根:申请(approval)然后用DCI进行场景设计写申请:bool save(approval model)提交申请:process commitTo(int roleid)审批申请:process approve(bool agreement,string commont)代码实现的话,我没有实用event sourcing方式把场景都由领域对象(即ApprovalContext类)实现banq大哥,这样有没有什么问题? banq 2012-05-21 08:43 审批系统是一种以动态过程为主的系统,是过程主导数据的产生。实体是Approval是否代表申请这个过程产生的结果?因为是以过程为主,场景应该在过程中实现,也就是写申请 提交申请和审批申请这几个服务中实现,不是在领域对象中实现。 liyao0409 2012-05-21 09:14 2012-05-21 08:43 "@banq"的内容审批系统是一种以动态过程为主的系统 ... 我设计的出发点是:每个场景都是针对申请这个对象发生的,申请又是这个子系统的聚合根,所以把他们放到这个领域对象里。如果都使用过程实现,似乎没有了DDD中的聚合根了,呵呵 banq 2012-05-21 14:23 对不起,我之前将“申请实体”和“审批状态”混合起来了。你这个审批系统的审批目标是“申请Approval”这个实体,它确实是DDD的实体聚合根,这个实体中可以有一些审批的规则切换,比如如果A流程通过,下一个流程是B或C,如果B流程通过,下面一个流程是C或D或E。场景还是发生审批服务中,流程切换规则根据实体中的规则进行切换。不要将场景发生在实体中,这肯定有问题,因为场景是具体怎么干,而实体中放入的都是战略性的抽象,就如同DNA一样,而平时人体内部各种活动发生都是在五脏六腑,而不是在DNA里发生一样,但是都离不开DNA的指导。[该贴被banq于2012-05-21 14:23修改过] liyao0409 2012-05-21 17:04 2012-05-21 14:23 "@banq"的内容这个实体中可以有一些审批的规则切换 ... 现在我没有做规则切换,属于比较随兴的那种上级可以结束审批,也可以再把审批转呈,也可以再接着转呈,这些环节中的任何一个人都可以结束审批。关于DNA的比喻相当精彩,我还需要再领悟一下。