代码改变世界

《WF编程》系列之14 - 工作流编写方式:结合代码与XAML

2007-04-25 12:18  Windie Chai  阅读(...)  评论(...编辑  收藏

2.4结合代码与XAML

Visual Studio还提供另外一种生成工作流的方式:代码分离与XAML标记结合的方式,即通常我们所说的code-beside.采用这种方式时,设计器会将工作流标记存储到一个XOML文件中,我们则可以在C#或Visual Basic源代码文件里扩充定义.这种开发方式的项目模板是Sequential Worklow (with code separation).

项目模板会在项目中添加两个文件,如果我们的工作流叫做CodeSeparation,那么这两个文件就是CodeSeparation.xoml和CodeSeparation.xoml.cs.如果这个工作流和之前的相同(内部有一个CodeActivity活动),那么CodeSeparation.xoml.cs文件会像下边的一样:

using System;

using System.Workflow.Activities;

namespace chapter2_library

{

  
public partial class CodeSeparation : 

      SequentialWorkflowActivity

  {

      
private void codeActivity1_ExecuteCode(object sender, 

 

EventArgs e)

      {

      }

   }

}

XOML文件会包含如下的XAML标记:

<SequentialWorkflowActivity 

  
x:Class="chapter2_library.CodeSeparation" 

  x:Name
="CodeSeparation" 

  xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" 

  xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/workflow">

  
<CodeActivity 

    
x:Name="codeActivity1" 

    ExecuteCode
="codeActivity1_ExecuteCode"/>

</SequentialWorkflowActivity>

XOML文件的默认编辑器是图形化的工作流设计器.如果我想要以XAML的方式查看XOML文件,我们可以右键单击这个文件并选择打开方式,在打开方式对话框中选择XML编辑器即可.
 

工作流的项目文件中定义了MSBuild目标,这些目标知道怎样编译XOML文件中的XAML工作流定义. 首先,编译器在临时目录中生成C#源代码,源代码中包含一个叫做CodeSeparation的类,并用partial关键字将其修饰分部类.像之前我们所描述的,C#通过合并两个文件来得到最终的类定义.

还记得使用纯代码方式创建工作流时,设计器生成的代码吗?工作流编译器生成的临时C#文件和它很像.

另外,Visual Studio还会自动添加它能找到的任何自定义活动到当前解决方案的工具箱面板中.

小结

我们已经学习了一系列编写和生成工作流的方式.现在我们可以使用XOML,然后通过编程或者从命令行工具来编译生成工作流;也可以使用纯代码或者代码分的方式离生成工作流.当工作流执行时,这些方式的运行并结果并没有什么不同.所有的编写方式最终都会在内存中创建对象的一个集合,这些对象包含了父子关系并由工作流Runtime管理它们的执行过程.

代码最适合用来定义通用且固定的工作流.使用工作流设计器时我们不需要查看设计器生成的代码,也不必去关心设计器如何组织工作流定义.

基于XAML的工作流定义则带来了一些附加功能.如果把工作流完全定义在XAML中,我们就可以使用工作流激活来避免编译.激活在需要动态地生成很大数量的工作流时很有用.我们仅仅需要传递XML到工作流Runtime中就可以得到一个可运行的工作流实例.

使用XAML和code‑beside文件结合的方式会把工作流定义在一个XML文件中.如果需要编写自定义工具(比如自定义工作流设计器),那么XAML是最好的选择.XAML可以被工具化,而且我们可以使用各种现有的XML API来编写我们需要的工具.XAML和CLR一样是语言无关的.基于XAML的工作流可以和任何.NET语言等效的工作.如果我们需要手工的调整工作流定义的话,相比基于代码的工作流定义而言,XML格式更容易理解.