2 工作流编写方式
Visual Studio 2005中的工作流设计器可以使用拖拽来设计工作流.在本章中,我们将通过设计器创建工作流,然后探索发生在后台的细节,最后我们将看到工作流定义变成了.NET程序集中的一个类型.由于Windows Worklow的灵活性,我们有许多途径可以将设计器中的工作流变成编译后的类型.
我们可以采用纯定义的方式(只用XAML)来编写工作流,也可以采用纯命令的方式(只用C#或Visual Basic代码),或者把XAML和代码结合起来编写工作流.
当工作流执行时,不同的编写方式不会有明显的影响.但当我们创建工作流时,由于需求的不同,这几种方式都各有优劣.本章将介绍这几种方法的优劣,然后再来看看如何将设计中的工作流转变成可执行的指令.
2.1 纯代码
使用纯代码的方式创建工作流是指只使用C#和Visual Basic代码来定义工作流(没有XAML).但这并不是说我们需要手工编写所有的代码.许多Visual Studio的设计器可以为我们生成代码,比如Windows forms designer几年前就可以生成C#和Visual Basic代码了.我们可以将设计器生成的代码和我们自己的代码结合起来生成工作流.
2.1.1 纯代码与Visual Studio
Visual Studio 2005 Extensions for Windows Workflow向Visual Studio中添加了一些项目模板.这些项目模板提供了创建工作流项目,工作流或者活动的入口点.
使用项目模板,我们只需要右键单击项目并选择添加|新建项.有一个采用纯代码方式的项目模板叫做Sequential Worklow (code).
当我们使用Sequential Worklow (code)模板向项目中添加了名为PureCode的工作流之后,我们可以看到两个文件:PureCode.cs和PureCode.Designer.cs.前者是供我们编辑的文件,而PureCode.Designer.cs则由设计器来维护.我们在设计器中添加一个CodeActivity.然后为其指定ExecuteCode事件,选择CodeActivity活动然后点击属性面板(或者右键菜单)中的Generate Handlers来生成默认的event handler.
这步操作会在PureCode.cs中生成下面的代码:
namespacechapter2_library
{publicsealedpartialclassPureCode: SequentialWorkflowActivity
{publicPureCode()
{
InitializeComponent();
}privatevoidcodeActivity1_ExecuteCode(objectsender, EventArgs e)
{
}
}
}
设计器在PureCode.cs文件中添加了一个空白的codeActivity1_ExecuteCode方法等待我们去实现.注意,构造函数调用了一个叫InitializeComponent的方法,但是这个方法并没有出现在PureCode.cs文件中.其实InitializeComponent方法也是PureCode类的成员,我们可以在另外一个文件中找到它的定义.这就是partial关键字的奇妙之处,它允许我们将类分开定义在多个源代码文件中.
PureCode类的其它定义部分在PureCode.Designer.cs文件里.通常我们不需要查看或编辑这个文件,因为其内部代码由工作流设计器负责生成:
namespacechapter2_library
{
partialclassPureCode
{#regionDesigner generated code//Required method for Designer support - do not modify///the contents of this method with the code editor.///[System.Diagnostics.DebuggerNonUserCode]privatevoidInitializeComponent()
{this.CanModifyActivities=true;this.codeActivity1=newSystem.Workflow.Activities.CodeActivity();codeActivity1//this.codeActivity1.Name="codeActivity1";this.codeActivity1.ExecuteCode+=newSystem.EventHandler(this.codeActivity1_ExecuteCode);PureCode//this.Activities.Add(this.codeActivity1);this.Name="PureCode";this.CanModifyActivities=false;
}#endregionprivateCodeActivity codeActivity1;
}
这里定义了InitializeComponent方法,并且在其内部包含了配置活动的代码.本例中,我们只添加了一个Code活动,上面的代码将其构造为工作流的子活动.
当我们编译项目时,C#编译器会把两个分部类定义结合成为一个单一类型.新的类型名为PureCode并且包含InitializeComponent和codeActivity1_ExecuteCode.
采用Visual Studio纯代码方式创建的工作流合并了由设计器和开发人员分别管理的代码文件.如果使用设计器来设计工作流的话,这是个极佳的选择.当然我们也可以手工或者使用其它工具来编写所有的代码.我们的最终目标是在工作流中创建一个层级的活动树,而且有一些定义工作流的方法可能更适合使用外部工具.