Shivprasad koirala在CodeProject上发表了一篇文章Windows Workflow Foundation FAQ,介绍了WF的基础知识。这对于理清WF的整个脉络有一定帮助,摘译如下。

什么是Windows工作流基础?

WWF(张逸注:微软的官方简称为WF)是一种编程模型,用于在Windows中构建支持工作流的应用程序。WF程序集的命名空间为System.Workflow。

什么是工作流?

工作流就是一套活动(activity)。活动作为模型被存储起来,描述了一个流程。每个任务就是一个活动,一组活动则表示一个完整的工作流。工作流运行时引擎负责运行工作流。

WF基础知识问答


图1  WF架构

工作流模型可以用纯粹的.NET代码或XAML来编写,也可以结合二者同时编写。工作流模型可以被编译,并运行在Windows、ASP.NET、Web Service或Windows Service。

WF中有几种类型的工作流,区别是什么?

WF中有两种基本的工作流类型:顺序工作流和状态机工作流。顺序工作流有一个很清楚的开始与结束边界。工作流会控制在顺序工作流的执行。在顺序执行中,任务被依次执行。顺序工作流格式更加固定,执行路径是事先确定好的。状态机工作流本质上更为动态。工作流具有状态,而状态则会等待事件被触发,然后使其移动到下一个状态。状态机执行路径是不可预知的。

WF基础知识问答


图2  顺序工作流和状态机工作流

通过图2可以看到,顺序工作流的执行路径是确定的。Shiv会顺序执行整个任务,这些任务都是确定的。而在状态机工作流中,每个状态只有在接收到某个外部事件时,才会移到另一个状态中。例如,Shiv正在观看“星际迷航”,此时,一条插播新闻的事件被触发,使得他又开始观看插播新闻。

何时使用顺序工作流,何时使用状态机工作流?

如果工作流是固定的,就选择顺序工作流;如果工作流是动态的,则选择状态机工作流。例如,你可以下订单,订单只有在管理员审批之后才会通过,这是一个固定的流程。因为你的订单必须通过管理员的审批,而其他人则没有审批的权利。然而,如果你的订单不停地在发生变化,情形就不相同了。例如,订单从审批到等待,再到取消,此时最好选择状态机工作流。

图3是一个执行顺序工作流的例子,注意图中每个步骤的标号:

WF基础知识问答


图3  顺序工作流代码示意

1:首先需要选择System.Workflow命名空间;
2、3和4:这三步创建了Code对象,并用活动将其连接起来;
5、6和7:启动一个工作流,并创建一个工作流实例对象以运行顺序工作流;
8:输出结果。

第3步添加了活动,使工作流顺序执行。添加到活动集合的顺序就是活动运行的顺序。

注意:图3的代码是通过使用设计器开发的。在实际的项目开发中,常常是使用设计器,而不是手工编写代码。

如何使用设计器创建工作流

使用设计器创建工作流的步骤如图4所示:

WF基础知识问答


图4  使用设计器开发顺序工作流

1、首先选择顺序工作流项目。为了简便起见,本例选择了Sequential workflow console application项目。
2、创建项目后,在解决方案浏览器中可以看到两个文件:WorkFlow1.cs和WorkFlow.designer.cs。单击WorkFlow1.cs,可以得到图中第3部分所示的设计图。双击WorkFlow1.designer.cs,则可以得到图中第4部分显示的代码。
3、可以在工作流设计器中拖动Code活动,并定义方法MyActivity1将活动关联起来。方法是在ExecuteCode属性中输入方法名。在MyActivity1中,将在控制台上显示字符串“This is my First Activity”。MyActivity2活动如法炮制。
4、是工作流的代码。

在工作流中可以使用conditionedActionGroup定义条件。图5展示了如何使用conditionedActivityGroup:

WF基础知识问答


图5  具有条件的工作流

1、在conditionedActivityGroup中定义了两个条件。
2、选择其中一个条件,并在WhenCondition属性中定义条件。如果条件为true,则需要在执行代码中指定哪个方法会被执行。例如,在图中我们指定当age>21时,执行old1方法。在第二个条件中,我们指定当age<21时,执行young1方法。图中未包含第二个条件的设置。
3、工作流编辑器提供了一个很棒的界面,称为规则条件编辑器(Rule Condition Editor),可以用于指定条件。Age是代码中定义的公共属性。在规则条件编辑器中可以通过智能感应获得Age属性。
4、所有的条件都会在条件活动组内执行。我们还需要指定conditionedActivityGroup何时结束。因此,定义了一个函数为exit。如果用户输入的年龄为-1时,就会结束循环,否则就会接收用户的输入,并根据条件判断执行。

在工作流中如何处理异常?

工作流中的异常处理不同于通常的.NET应用程序。图6说明了如何在工作流中处理异常:

WF基础知识问答


图6  工作流的异常处理

1、在标签中可以查看异常。如果单击查看异常,就会转到工作流设计中,如图中第2部分所示。
2、这是一个在出现异常时执行的工作流。图2中的Code活动指向了一个名为raiseException的方法。在异常情况下,该路径会被执行。

XOML文件的使用

WF为开发者提供了声明方式,通过使用XAML创建工作流。XAML创建的标记文件以XOML(eXtensible Object Markup Language,扩展对象标记语言)的扩展名存储。如下所示就是使用设计器创建的Workflow1.xoml文件。标记文件同时包含了代码(code behind形式)。
<?Mapping XmlNamespace="ComponentModel"
    ClrNamespace="System.Workflow.ComponentModel"
    Assembly="System.Workflow.ComponentModel" ?>
<?Mapping XmlNamespace="Compiler"
    ClrNamespace="System.Workflow.ComponentModel.Compiler"
    Assembly="System.Workflow.ComponentModel" ?>
<?Mapping XmlNamespace="Activities"
    ClrNamespace="System.Workflow.Activities"
    Assembly="System.Workflow.Activities" ?>
<?Mapping XmlNamespace="RuleConditions"
    ClrNamespace="System.Workflow.Activities.Rules"
    Assembly="System.Workflow.Activities" ?>
<SequentialWorkflow x:Class="WorkflowSeq.Workflow1"
    x:CompileWith="Workflow1.xoml.cs" ID="Workflow1"
    xmlns:x="Definition" xmlns="Activities">
<Code ExecuteCode="Mycode3" ID="code3" />
<Code ExecuteCode="Mycode1" ID="code1" />
</SequentialWorkflow>

 

根据上面的XOML文件所示,可以看到其后的代码是如何与XOML文件中的Attribute联系起来的。Code组成了SequentialWorkflow标签中的元素。使用标记语言的一个好处是我们可以通过修改XOML文件更改执行顺序,而不需要再次编译整个应用程序。

WF基础知识问答


图7   XOML

在图7中,3、4、5与例子无关,但通过它们可以看到实际上使用了TextWriter对象对工作流进行了序列化和反序列化。

如何将参数传递给工作流?

当你调用启动工作流的方法时,可以使用字典对象传递一个name/value对。如图8所示:

WF基础知识问答


图8 将值传递给工作流