Windows工作流基类库(WF)探密

小编辑 发布于 2010/05/18 01:28
阅读 762
收藏 0

虽然我们无法跟踪微软的所有新技术,但是Windows工作流基类库(WF)却是一项我们无论如何都不能错过的技术。本文将阐明WF的优势,并且建 立我们的第一个基于WF的应用程序。WF是一套多功能的编程构架,这套框架用于建立图形化的商业规则控制流程序。

WF是四项技术之一, 其它三项技术为WPF、WCF和Windows CardSpace。这些技术同.NET 3.0框架一起发布。也许这个”3.0”非常带有迷惑性,有很多开发人员认为这些技术必须运行在新的.NET框架中,事实上,所有的技术都是运行 在.NET2.0中的。这些软件和框架的层次如图1所示。

Windows工作流基类库(WF)探密

图1

现在面临的问题是有很多.NET开发商一直不愿意使用新版本的.NET framework,原因是如果使用这些新的framework,就必须在客户的机器上安装它们。但事实上,.NET 3.0技术只是在.NET 2.0的基础上加了一些库而已。我们可以在VS2005中象使用其他的第三方.net库一样使用它们。

一、WF的优势

按着长规,一种新的技术必须为他们的黄金时代做准备,以及在它们被广泛使用之前提供切实可行的解决方案。这两点WF都做到了。WF不仅采用 了.NET3.0技术,而且是根据实际需要的功能和设计经验而精心实现的。下面是关于WF的一些实际的优势:

1.WF提供了一套高度抽 象和可视化的商业处理模型。这套模型可以非常容易地使用和被理解。无论使用它的是开发人员或是商业领域专家。

2.WF可以非常容易地改 变与之相关的商业处理规则,并且不必重新编译。

3.WF编程模型可以使开发人员建立一套可测试的内核集合,并且可以在多个程序中使用它 们。

如果和UML的活动图进行比较的话,WF图表拥有最好的软件构架,我们并不用担心这套构架过时,或是和商业处理逻辑有分歧,因为WF就 是商业处理逻辑。

WF运行时为我们提供了一个强大的,可扩展的开发执行环境。为了可以长时间处理,当工作流处理空闲状态时,可以被保存 在一个数据库中。当一个动作发生时,工作流被激活。

二、面向动作编程(Activity-Oriented Programming,AOP)

WF向.NET开发人员引入了一个而向动作编程的概念。这套编程模型可以通过组合动作集合来完成大规 模的商业处理逻辑。

下面我们来看看图2所示的部分工作流,一个工作流图包含了如validateProductActivity, sellProductActivity, backOrderProductActivity和shipOrderActivity等动作。在工作流中的每一个动作都拥有一个单独的执行单元。

Windows工作流基类库(WF)探密

图2工作流图:一个包 含了动作的工作流图,它们中的每一个都执行一个商业处理逻辑。

我们可以使用WF设计器将动作加到一个图表中,并且指定相应的条件以及基 于一定规则的控制流指定工作流程。这种方法是非常强大的,它将使我们的应用程序非常容易编写,理解和配置。

三、开始编写WF程序

为了编写WF程序,我们需要如下的开发环境:

1..NET 2.0 Framework

2.Visual Studio 2005

3..NET 3.0 Framework

4.Visual Studio 2005 工作流扩展

在.NET 3.0中的WF框架中定义了超过350个类,这些类分别在如下的三个命名空间中:

1.System.Workflow.Activities

2.System.Workflow.ComponentModel

3.System.Workflow.Runtime

当我们在VS2005中安装WF扩展时,WF扩展将 VS2005中加入一个工作流模板工程,我们可以选择这个模板工程来建立或加一个新的WF项目。

在安装完上术的软件后,我们就准备建立 第一个工作流。下面的部分将描述建立和编写WF程序的一系列步骤。

四、顺序工作流和状态机工作流的对比

我们可以建立 两个类型的工作流:顺序工作流和状态机工作流。在图2中显示的是一个顺序工作流,这个图类似于UML的动作图。这种工作流将按着预先定义的顺序来执行。

与之大不相同,状态机工作流定义了一个状态的集合,在些状态之间可以互相转换。工作流的外部事件将处理状态之间的转换。为了简便起见,本文将只关注顺序 工作流。

最后,我们可以将任何顺序工作流描述成一个状态机工作流,反之亦然。然后,每一种工作流类型并不是对所有应用程序都适合,如在 人机交互的情况下,状态机工作流将是最好选择。

五、建立一个工作流应用程序

在建立一个工作流之前,我们需要建立一个 主应用程序,工作流将运行在这个程序中。为了完成这个工作,首先启动Visual Studio 2005,单击File菜单,选择New > Project。在新建工程对话框中选择相应的工程类型(如图3的工作流类型)和开发语言。

Windows工作流基类库(WF)探密

图3新建工程模板。 通过VS2005的工作流扩展建立指定的基于工作流的应用程序库。

在这个模板页中,选择序列工作流控制台应用程序来建立一个基于控制台 的工作流应用。将工程命名为SequentialWorkflowConsole。在工程被建立后,我们将看到一个新的,空的序列工作流程序,如图4所 示。

Windows工作流基类库(WF)探密

图4新的工作流。当我 们建立一个新的工作流应用程序时,当将包括一个序列工作流图。

下面到Visual Studio的工具面板,找到Windows工作流页,这个控件页中包含了一些预定义的动作图(如图5所示)。我们可以将它们拖到刚才建立的工作流图中。

Windows工作流基类库(WF)探密

图5

接下来,将解决方案树展开,会出现三个System.Workflow引用。这三个库就是.NET3.0中所带的Windows工作流组件库。

为了更好地理解动作工作流应用程序,打开Program.cs文件(C#)或Module.vb文件(Visual Basic)。我们会看到如下的代码。

代码1(C#):

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(
SequentialWorkflowConsole.ProcessOrderWorkflow));
instance.Start();
waitHandle.WaitOne();
Console.WriteLine("Press any key to continue...");
Console.ReadLine();
}
}

代码2(Visual Basic):

Shared WaitHandle As New AutoResetEvent(False)
Shared Sub Main()
Using workflowRuntime As New WorkflowRuntime()
AddHandler workflowRuntime.WorkflowCompleted,
AddressOf OnWorkflowCompleted
AddHandler workflowRuntime.WorkflowTerminated,
AddressOf OnWorkflowTerminated
Dim workflowInstance As WorkflowInstance
workflowRuntime.CreateWorkflow(GetType(Workflow1))
workflowInstance.Start()
WaitHandle.WaitOne()
Console.WriteLine("Press any key to continue...")
Console.ReadLine()
End Using
End Sub

要注意的是这两个文件的最后两行会在调用WaitHandle.WaitOne()之后执行。这些代码行显示了一个控制台消息,并且等待控制台输入。将 这两行加到我们的控制流应用程序中,并使我们的控制台工作流程序始终处于运行状态(直接输入一个字符串,并按回车为止)。

六、编写代码 动作程序

得到一个简单的工作流,并运行它的最容易的方法就是使用代码动作。下面将演示如何使用一个单独的代码动作来实现一个简单的工作 流,并演示了如何使用工作流设计器和工作流工具箱。

下面再在解决方案浏览器上,双击WorkFlow1图表来演示设计器。从 Visual Studio工具箱中,拖动代码动作,并将它们放到序列工作流图上,如图6所示。我们将看到一个红色的感叹号错误标记(在代码动作的右上角)。如果我们单 击这个标记,就会显示错误信息:“Property "ExecuteCode" is not set”.意思是说,我们还没有输入用于执行的代码动作。这是Windows工作流的一个非常重要的特性,用来提示开发人员应该按着步骤来输入相应的代 码,来对动作进行完善(一般是设置一个属性,或是建立一个事件处理方法)。

Windows工作流基类库(WF)探密

图6错误标记。表示还 没有输入相应的动作代码。

为了使这个代码动作完整,并消除这个错误,双击图中的动作来建立一个事件处理函数。然后加入如下的处理代码。 在本例子中,只是简单地向控制台写入一个字符串:

// C#

private void codeActivity1_ExecuteCode(object sender,
EventArgs e)
{
Console.WriteLine("Hello WF World!");
}

' Visual Basic
Private Sub codeActivity1_ExecuteCode()Sub codeActivity1_ExecuteCode(ByVal sender As
System.Object, ByVal e As System.EventArgs)
Console.WriteLine("Hello WF World!")
End Sub

现在我们已经建立了一个工作流应用程序,并且拥有了一个动作,下面我们准备运行它。

七、运行我们的工作流程序

在运 行程序之前,我们可以在main函数里设置断点来观察工作流本身的运行情况以及其他的细节部分。

在C#中打开Program.cs或在 Visual Basic中打开Module.vb,并且在Main()方法中的表达式中设置一个断点。

按F5来运行这个工作流程序, 然后按F10一步一步地跟踪Main()方法中的每一行程序。当我们按步骤跟踪代码时,要注意这些关键的动作在该方法中的执行情况。下面是程序各部分运行 的步骤:

1.首先,WF运行时被实例化。这个会最先发生,这是因为WF使用运行时来实例化,、执行以及管理我们的工作流。

2.动作的处理方法当工作流的运行时的WorkflowCompleted 和 WorkflowTerminated事件发生时被注册。这将允许当一个工作完成或中途退出时通知工作流应用程序。

3.工作流被实例 化。要注意的是应用程序并没有直接实例化工作流,而是通过调用工作流运行时的CreateWorkflow()方法来实例化工作流的。

4. 最后,这个方法调用了工作流的Start()方法,这个方法开始执行工作流的动作代码。

当工作流完成时,我们将会看到如图7所示 的一个控制台窗口,在其中显示“Hello WF World!”。按任意键后,这个控制台窗口将关闭,然后按F5将退出这个工作流应用程序。

图7工作流应用程序执行后的界面。在这个界面中显示了动作代码执行后的输出信息“Hello WF World”

加载中
返回顶部
顶部