WF提供运行时修改流程实例的功能,事实上可以在流程运行过程中增加、修改和删除流程步骤,甚至是在流程运行的时候再增加外部的流程。这个功能解决了很多流程引擎不能解决的问题,当用户审批到某个步骤时,突然想改变流程,怎么办呢?原来的方式是重新定义流程,但其他用户想按原来的流程走完,这样可能就要定义两个不同的流程。WF提供运行时修改流程实例的功能将彻底的解决这个问题,用户可以在运行时修改属于他自己的实例,跟其他用户没有关系,流程定义也不用修改。
接下来我用设备申请审批流程中的实例来说明怎么在运行时增加流程步骤,假如设备申请单到了副总理处,副总经理发现金额比较大,需要总经理审批。副总经理可以自己增加一个步骤,原来的流程不用变化。这里有两个技术要点:
(1) 自定义流程步骤Activity。自定义的流程步骤可以是一个Activity,也可以是一个Activity的组合,还可以使另外一个流程,非常灵活。这里定义的是包括一个外部事件Activity和外部方法Activity的组合,其中外部事件Activity用于触发(唤起)流程,外部方法Activity执行特定的操作。
(2) 运行时增加流程步骤。WorkFlowChanges对象用于修改流程步骤,修改步骤之前需要挂起流程实例,修改之后重启即可。
//
挂起
workflowInstance.Suspend( " suspending to add step " );
// get WorkflowChanges
Activity workflowInstanceDefinition = workflowInstance.GetWorkflowDefinition();
WorkflowChanges workflowChangesToMake = new WorkflowChanges(workflowInstanceDefinition);
// setup to invoke NewStepActivity type
System.Workflow.ComponentModel.Activity addActivity = new NewStepActivity();
// insert activity to index 5
workflowInstance.Suspend( " suspending to add step " );
// get WorkflowChanges
Activity workflowInstanceDefinition = workflowInstance.GetWorkflowDefinition();
WorkflowChanges workflowChangesToMake = new WorkflowChanges(workflowInstanceDefinition);
// setup to invoke NewStepActivity type
System.Workflow.ComponentModel.Activity addActivity = new NewStepActivity();
// insert activity to index 5
workflowChangesToMake.TransientWorkflow.Activities.Insert(
5
, addActivity);
// apply transient changes to instance
workflowInstance.ApplyWorkflowChanges(workflowChangesToMake);
// 重启
workflowInstance.Resume();
// apply transient changes to instance
workflowInstance.ApplyWorkflowChanges(workflowChangesToMake);
// 重启
workflowInstance.Resume();