Windows Workflow Foundation 入门--创建第一个WorkFlow
工作流 是以活动示意图形式定义的人力或系统过程模型。活动 是工作流中的一个步骤,并且是工作流的执行、重用和创作单位。活动示意图表达规则、操作、状态以及它们的关系。Windows Workflow Foundation 工作流通过安排活动而设计,然后它编译为 .NET 程序集,且在工作流运行库和公共语言运行库 (CLR) 中执行。
创建第一个工作流
Windows Workflow Foundation 主要由 .NET 驱动的运行库环境组成,该环境处理在 Visual Studio 设计器中设计和实现的特殊对象。Microsoft .NET Framework 2.0 是支持 Windows Workflow Foundation 所必需的。单独的安装程序包为 Visual Studio 2005 添加了 Windows Workflow Foundation 设计器和项目模板支持。一旦安装,就会向 Visual Studio 2005 中的标准项目列表中添加一个全新的节点,如图 1 所示。
图 1. Visual Studio 2005 中的工作流项目模板
您可以在各种选项中进行选择,其中每个选项都标识了特定类型的工作流应用程序。表 1 显示工作流项目模板的不完全列表。
表 1. Visual Studio 2005 中的工作流项目类型 | |
类型 | 说明 |
顺序工作流控制台应用程序 (Sequential Workflow Console Application) |
创建用于生成工作流的项目,该工作流包含一个默认的顺序工作流和一个控制台测试宿主应用程序。 |
顺序工作流库 (Sequential Workflow Library) |
创建用于以库的形式生成顺序工作流的项目。 |
工作流活动库 (Workflow Activity Library) |
创建一个用来创建活动的库的项目,以后可以将其作为工作流应用程序中的构造块重用。 |
状态机控制台应用程序 (State Machine Console Application) |
创建用于生成状态机工作流和控制台宿主应用程序的项目。 |
状态机工作流库 (State Machine Workflow Library) |
创建用于以库的形式生成状态机工作流的项目。 |
空工作流 (Empty Workflow) |
创建可以包含工作流和活动的空项目。 |
Windows Workflow Foundation 支持两种基本工作流样式:顺序工作流和状态机工作流。
顺序工作流 非常适合以下类型的操作,即该操作由依次执行直至最后一个活动完成的步骤的管线表示。但是,顺序工作流的执行并非完全是顺序的。它们仍然可以接收外部事件或者启动并行任务,在这种情况下,确切的执行顺序可能有所不同。
状态机工作流 由一组状态、转换和操作组成。首先,将一个状态表示为起始状态,然后,基于事件执行向另一个状态的转换。状态机工作流可以具有确定工作流结束的最终状态。
让我们假设您选择并创建了一个新的顺序工作流控制台应用程序项目。Visual Studio 2005 解决方案资源管理器将包含两个文件 — workflow1.cs 以及最初从视图中隐藏的 workflow1.designer.cs。这两个文件表示创建的工作流。Windows Workflow Foundation 工作流包含工作流模型文件和一个代码文件类。workflow1.cs 类是可在其中写入您自己的工作流业务逻辑的代码文件类。workflow1.designer.cs 类表示活动示意图的说明。该文件由 Visual Studio 2005 按照与 Microsoft Windows Forms 项目中的窗体非常类似的方式自动管理。当向工作流中添加活动时,Visual Studio 2005 会用以编程方式生成活动示意图的 Microsoft C# 代码更新设计器类。要继续使用 Windows 窗体的类比,那么工作流类似于窗体,而活动类似于控件。
我们可以为活动布局选择另一种形式的持久性 — XML 工作流标记格式。要尝试这一方法,可从项目中删除 workflow1.cs 文件并添加一个新的工作流项(HelloWorldFlow),如图 2 所示。
图 2. 用代码分隔添加顺序工作流项
现在,项目包含两个文件:HelloWorkFlow.xoml.xoml 和 HelloWorkFlow.xoml.xoml.cs。前一个文件包含表示工作流模型的 XML 工作流标记;后一个文件是一个代码文件类,并且包含工作流的源代码和事件处理程序。如果双击 .xoml 文件,会看到处于运行状态的可视工作流设计器(参见图 3)。
不存在为工作流模型的序列化选择标记或代码的运行时暗示 — 一旦该工作流编译为程序集,它们就是等效的。
工作流应用程序是完成工作(例如,发送或接收数据)的活动和管理一组子活动的执行的复合活动(例如,IfElse 和 While)的混合体。工作流可实现复杂的端到端方案,例如文档审阅、PO 批准、IT 用户管理、合作伙伴之间的信息交换、任何种类的向导或业务线应用程序。
图 3 显示一个极为简单的示例工作流,它只包含一个活动 — code1 块。
图 3. Visual Studio 2005 工作流设计器
Code 块对应于 Code 类的一个实例,并且表示工作流中的一个活动,其行为以用户定义的代码表示。后端代码是通过 Visual Studio 2005 输入的(只需双击设计器中的所选元素),这是 ASP.NET 应用程序和其他 Visual Studio 2005 项目为人熟悉的编程风格。
当双击该活动时,代码文件会打开且提供代码处理程序的存根。
private void codeActivityHello_ExecuteCode(object sender, EventArgs e){ // Some code here }
当工作流运行库在处理工作流的过程中开始处理指定的活动块时,在代码处理程序中键入的任何语句都将执行。以下代码只是输出一条欢迎消息。
private void code1_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("Hello World", }
除了可视化布局以外,工作流还包含 workflow1.xoml.cs 文件中保存的以下代码。
using System; using System.ComponentModel; using System.ComponentModel.Design; using System.Collections; using System.Drawing; using System.Workflow.ComponentModel.Compiler; using System.Workflow.ComponentModel.Serialization; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design; using System.Workflow.Runtime; using System.Workflow.Activities; using System.Workflow.Activities.Rules; namespace HelloWorldWorkflow { public partial class Workflow1 : SequentialWorkflow { private void code1_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("Hello World", } } }
工作流只能由 Windows Workflow Foundation 工作流运行库执行,并且工作流运行库需要外部应用程序按照若干个规则来承载它。出于测试目的,Visual Studio 2005 还向项目中添加了一个 program.cs 文件。该文件是一个简单的控制台应用程序,如下所示。
namespace HelloWorldWorkFlow
{
class Program
{
static void Main(string[] args)
{
using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
AutoResetEvent waitHandle = new AutoResetEvent(false);
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
{
Console.WriteLine(e.Exception.Message);
waitHandle.Set();
};
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(HelloWorldWorkFlow.HelloWorkFlow));
instance.Start();
waitHandle.WaitOne();
}
}
}
}
正如您在上述代码中的粗体行中看到的那样,出于简单性的目的,Visual Studio 2005 在该控制台应用程序中硬编码工作流类的名称。要防止控制台应用程序在完成之后立即退出,您可能需要在 Main 方法的结尾添加 Console.ReadLine 调用。此刻,您已经做好生成和测试该工作流的所有准备:请按 F5 并执行。如果一切顺利,那么会看到图 4 中显示的输出。
图 4. 控制台宿主应用程序执行的示例工作流