workflow是什么?
龚彬
2023-12-01
workflow是为了完成一些预定的目的,根据一组规则,而制定的一系列步骤。对于一个开发者来说,workflow则是将复杂的业务规则以及控制流程以图形化的方法声明出来,组成一个高度可视化的图形环境。
一、工作流分类
在WF中,工作流分为两种类型,序列式(Sequential)和状态机(State Machine)。
序列式工作流将一系列待执行的步骤以一种预先描述好的次序描述出来。在这种工作流里,控制流程的是我们很熟悉的诸如if-else和while循环结构。这个工作流有着确定的起点与终点,我们不能随意跳转到中间的某个点上,唯一能做的只有从头开始。
状态机工作流则并不定义固定的流程,它们定义一组状态,包括状态之间可能存在的转移。每个状态可以转移到一个或多个其它状态上去。执行这样的工作流不一定要从第一个状态开始。这就允许工作流被打断,然后根据需要恢复。在WF中,状态的转移是通过宿主应用程序引起的外部事件触发的,这就意味着工作流的控制完全是交由外界完成的。
具体在设计时该选择哪一种工作流是一个很重要的问题。一般来说,判断的依据就在于控制工作流走向的重要选择是发生在工作流的内部还是外部,是否由用户进行控制。序列工作流在本质上是对工作流的路径建模,将路径信息都编码到了模型之中,因此适合于前一种情况;在某些时候,我们并不关心工作流的路径,我们只关心当前的工作流状态,并且有哪些可能的选择会跳转到某个另外的状态,这就是后一种情况,应该采用状态机工作流。
二、创建工作流
1. 在.NET Framework 3.0中,我们可以通过WF简化和增强开发。它不是一个独立的应用程序,而是一个能够在应用程序中启用workflow模型的设计。
2.创建Activity:所有的activity都是直接或间接派生自System.Workflow.ComponentModel.Activity基类。MS提供了一组标准的activity供我们使用,但我们也可以随心所欲自己定义新的activity来。工作流本身实际上就是一种活动。活动是真正通用的WF构建块。一个能够寄宿其它活动的活动被称作复合活动(composite activity)。没有这种能力的活动就称为简单活动(simple activity)。
? Custom Workflow Logic
特指CodeActivity。利用它我们可以直接向工作流添加我们自己的业务逻辑。将CodeActivity添加到工作流后,我们就得到了一个处理ExecuteCode事件的句柄,并可以向其添加代码。
? Flow Control
顾名思义,控制工作流中数据流向的活动。包含了一些我们非常熟悉的编程结构,比如分支和循环。同时还有诸如并行、延时、中断、挂起等活动,它们以自己的方式来控制整个流程的进行。
? IfElseActivity和IfElseBranchActivity
这个我们在前面的Calculator中已经看到了。利用它可以构建多选条件分支。这是一个复合活动,包含有两个或更多的IfElseBranchActivity,在运行时,只有一个确定的分支会被执行。
IfElseBranchActivity包含了一个我们自己定义的条件,如同前面指出的,这个条件可以是代码形式定义的,也可以是规则定义的。一旦条件被评定为“真”,那么该条分支中包含的子活动就会被执行,其它分支就被华丽的54掉;评定为“假”的时候,它的下一条分支的条件将被评定。最终的分支不需要定义条件,只要前面的分支条件都不满足,它就会被视为if-elseif-else组合中的最后一个“else”。
? WhileActivity
当条件为真的时候,循环执行它的子活动。同样的,它的条件可以是代码形式也可以是规则形式。该条件是在进入子模块之前就判断的,也就是说初始条件若为false,那么它内部包含的活动不会被执行。
? DelayActivity
暂时中止工作流的执行一段时间。常被用来设定一段延时,等待外部事件。
? SequenceActivity
一个能够允许我们添加多个顺序执行的自活动的复合活动。可以看做是WPF中的“容器”,有些只能接受一个子活动的活动比如ReplicatorActivity、WhileActivity和ParallelActivity,可以用这种方法来添加“多个”子活动。
? ParallelActivity
允许我们计划两个或更多的子分支同时执行。
? ReplicatorActivity
此活动创建并执行单个子活动的多个副本。在运行时,它可以基于数据集的对象数目来创建子活动的多个实例。有了这个东东,开发者就可以采用数据驱动的数据流(data-driven workflow),其特点是子活动实例的数量只有在运行时才能确定。从这一点上说,它很像C#中的foreach语句。
? ConditionedActivityGroup
简称CAG,用来有条件地执行一系列子活动。每一个子活动都与一个WhenCondition进行关联,凡是满足WhenCondition的子活动都会被执行,而非if-else那样只能执行其一。
? InvokeWorkflowActivity
用来启动第二个工作流。第二个工作流是异步执行的,所以这个活动会在新工作流完成之前返回。
? SuspendActivity
停止当前工作流的执行,但并不是永久中断。常用在工作流出错但这个错误又是可以恢复的地方,工作流可以从断点重新启动。
? TerminateActivity
立即停止工作流实例的执行,并且是“终结”,不能再次恢复。
? Statement Management
这一类活动都是在状态机工作流中使用的。包括的活动被用来定义、初始化和完成一个状态,或是转移到另一个状态。
? StateActivity
代表一个单一的状态,也是状态机工作流的基础。StateActivity通常被添加进状态机工作流的顶级,但也可以塞进另一个StateActivity里。
? SetStateActivity
被用作转移状态。通过设置TargetStateName属性来指定新的状态。
? StateInitializationActivity
这是一个可选的活动,包含有当首次进入到一个状态时要执行的活动。一个StateActivity里最多只能定义一个。
? StateFinalizationActivity
与上面那个活动相反,它定义的是离开某个状态之前需要执行的业务。
? Event Handling
这一类活动与事件句柄相关,并且需要与接收这些事件的子活动一起工作。这里提到的活动本身并不实际接收这些事件,它们只是另一些事件驱动(event-driven)活动的容器。下面提到的活动解释都比较复杂,我暂时也搞不清楚,在这里仅仅列出名称,详情还请参阅MSDN。
? ListenActivity和EventDrivenActivity
? EventHandlersActivity和EventHandlingScopeActivity
? Local Service Communication
用来在一个工作流和一个本地服务之间进行通讯。
? CallExternalMethodActivity
? HandleExternalEventActivity
? Rules
一类用于联系工作流规则引擎的活动。特指PolicyActivity,可以允许我们定义一组规则,作用于工作流的字段或属性之上。
? Web Services
这一类活动使得我们的工作流可以与web服务进行交互。
? InvokeWebServiceActivity
? WebServiceInputActivity
? WebServiceOutputActivity
? WebServiceFaultActivity
? Transactions, Compensation与Synchronization
这一类活动可以是我们能够定义一个包括了多个活动的工作单元。同时也包括对变量的同步访问。Compensation的功能是对已经成功执行的行动进行undo。
? TransactionScopeActivity
? CompensatableTransactionScopeActivity和CompensatableSequenceActivity
? CompensateActivity和CompensationHandlerActivity
? SynchronizationScopeActivity
? Exceptions和Error Handling
这些活动与.NET异常协同工作。
? ThrowActivity
可以作为一个工作流步骤抛出一个.NET异常。与使用C#代码throw异常的结果是一样的。
? FaultHandlerActivity和FaultHandlersActivity
这两个活动用来捕捉和处理工作流内部的.NET异常。后者包含了前者对象的集合,是一个复合活动。
? CancellationHandlerActivity
是一个用来清除与复合活动联系的容器
3.自定义活动
1)
继承自Activity,每个自定义的活动都应该设计为独立的组件。
2)
定义属性:用于输入、接受参数
public static DependencyProperty AccountIdProperty = DependencyProperty.Register("属性", typeof(int), typeof(Activity名));
3)
Execute实现自定义活动的逻辑
override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
三、运行工作流
1. WorkflowRuntime 引擎
2. WorkflowInstance 实例
3 .AutoResetEvent 用于线程处理,通知等待线程已经发生的事情
private WorkflowRuntime _workflowRuntime;
private AutoResetEvent _waitHandle = new AutoResetEvent(false);
WorkflowInstance instance = kflowRuntime.CreateWorkflow(typeof(CalculatorWorkflow.Workflow1), wfArguments);
instance.Start();
// 等待处理完成
_waitHandle.WaitOne();