65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Visual Studio 2008 Express Edition 的工作流基金会项目

starIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

1.00/5 (1投票)

2008年11月2日

CPOL

4分钟阅读

viewsIcon

60911

downloadIcon

823

使用 VS 2008 Express Edition 的顺序 WF 示例。

引言

本文可以帮助任何 .NET 开发人员,无论是 C# 还是 VB.NET,在使用免费提供的 Microsoft Visual Studio 2008 Express Edition 开始编程 Windows Workflow Foundation。

背景

Visual Studio 2008 Express Edition 的一个限制是缺少许多应用程序和项目类型的 Standard 和 Professional Edition 设计器,包括新的 .NET 3.0 和 3.5 Framework Workflow Foundation。

Windows Workflow Foundation 是一个框架,使用户能够在为 Windows Vista、Windows XP 和 Windows Server 2003 操作系统编写的应用程序中创建系统或人工工作流。它包含一个命名空间、一个进程内工作流引擎以及用于 Visual Studio 2005 / 2008 的设计器。如前所述,这些设计器在 Visual Studio 的 Express Edition 中缺失。

Using the Code

本文的代码改编自标准 Microsoft 培训资源,可在此处获取,这是一个包含 Windows Communication Foundation (WCF)、Windows Workflow Foundation (WF) 和 Windows CardSpace 的示例包。

我选择了名为SimpleSequentialWorkflow的最简单示例来改编这篇教育性文章,以展示在 Visual Studio 2008 Express Edition 中编译和创建的工作流示例。

附带的下载FirstWF.ZIP是一个完整的解决方案,已在 VS 2008 Express Edition 中创建、编译并运行。您可以将其解压缩并在 VS 2008 Express Edition 会话中运行。

现在,让我们快速动手吧……

  1. 打开 VS 2008,从“文件”菜单中选择“新建项目”,然后选择“控制台应用程序”,再给它起个名字。(在右侧的“解决方案资源管理器”面板中,选择解决方案节点,然后从菜单中选择“文件 - 另存为解决方案”,以便在您选择的文件夹下更好地定位解决方案和项目文件。)
  2. 一个名为Program.cs的默认骨架类已为您创建。在右侧的“解决方案资源管理器”窗口中选择“引用”,然后右键单击以添加对以下 WF .NET 类库的引用:System.Workflow.RuntimeSystem.ComponentModelSystem.Workflow.Activities
  3. 从本文附带的解决方案中,复制并粘贴Program.cs C# 源文件的代码。(暂时忽略可能出现的任何编译错误。)
  4. 在“解决方案资源管理器”窗口中,选择“项目”节点,然后右键单击“添加新项”,类型为 C# 类。将其命名为SequentialWorkflow
  5. 从本文附带的解决方案中,复制并粘贴SequentialWorkflow.cs C# 源文件的代码。(现在应该不会出现编译错误了!)

现在,让我们快速浏览一下以下代码片段(SequentialWorkflow.cs

public sealed class SequentialWorkflow : SequentialWorkflowActivity

这是SequentialWorkflow类型类的声明,它将在运行时由 WF 工作流运行时实例化,以托管并运行我们示例的工作流活动。

活动在此类的构造函数中创建并运行,以实现一个简单的“一站式”示例。通常,在大型项目中,它应该在另一个源文件(或多个文件)中实现。我们在此示例中的工作流是一个简单的审批流程,它检查一个虚构的限制,在这种情况下,每次都返回 true,如下面的代码所示。

private void IsUnderLimit(object sender, ConditionalEventArgs e)
{
    e.Result = true;
}

SequentialWorkflow类的构造函数负责创建实现工作流所需的活动。

以下行初始化私有成员IsUnderLimitIfElseActivity。然后,创建一个System.Workflow.Activities.CodeCondition活动来评估this.IsUnderLimit调用(始终为 true!)。还创建了活动分支以供 111 使用,并将YesIfElseBranch分支分配给codecondition1以进一步处理审批评估。代码如下所示..

 this.CanModifyActivities = true;
System.Workflow.Activities.CodeCondition codecondition1 = 
    new System.Workflow.Activities.CodeCondition();
this.IsUnderLimitIfElseActivity = new System.Workflow.Activities.IfElseActivity();
this.YesIfElseBranch = new System.Workflow.Activities.IfElseBranchActivity();
this.NoIfElseBranch = new System.Workflow.Activities.IfElseBranchActivity();
this.ApprovePO = new System.Workflow.Activities.CodeActivity();
this.RejectPO = new System.Workflow.Activities.CodeActivity();

// 
// IsUnderLimitIfElseActivity
// 

this.IsUnderLimitIfElseActivity.Activities.Add(this.YesIfElseBranch);
this.IsUnderLimitIfElseActivity.Activities.Add(this.NoIfElseBranch);
this.IsUnderLimitIfElseActivity.Name = "IsUnderLimitIfElseActivity";

// 
// YesIfElseBranch
// 
this.YesIfElseBranch.Activities.Add(this.ApprovePO);
codecondition1.Condition += new 
  System.EventHandler<System.Workflow.Activities.ConditionalEventArgs>(this.IsUnderLimit);
this.YesIfElseBranch.Condition = codecondition1;
this.YesIfElseBranch.Name = "YesIfElseBranch";

现在,所有的魔力都从Program.cs控制台应用程序 C# 文件开始,它创建一个WorkflowRuntime(如下所示),该运行时托管SequentialWorkflow类型的工作流。接下来,这个运行时对象实例在另一个线程上启动/初始化(在运行时,使用反射)一个派生自SequentialWorkflow类类型的对象实例,即SequentialWorkflow。这会启动我们虚构的审批工作流流程,以便调用IfElse,运行CodeCondition以评估审批的CodeActivity,然后根据结果调用IfElse分支活动。

using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
    try
    {

        Console.WriteLine("Runtime Started.");
        // Load the workflow type
        Type type = typeof(SequentialWorkflow);
        // Listen for the workflow events
        workflowRuntime.WorkflowCompleted += OnWorkflowCompleted;
        workflowRuntime.WorkflowTerminated += OnWorkflowTerminated;
        // Create an instance of the workflow
        workflowRuntime.CreateWorkflow(type).Start();
        Console.WriteLine("Workflow Started.");
        ...

其余的辅助代码和粘合代码都很容易阅读。简而言之,它只是挂接一个事件处理程序,以便在上面启动的工作流线程完成其工作时报告其状态。

关注点

这是一个基本的 WF 示例,无需使用 Express Edition 的 VS WF 设计器即可创建,它演示了一个顺序工作流用于审批,该审批使用了标准的 WF CodeCondition Activity 以及IfElseActivityIfElseBranchActivityCodeActivity

希望这对某人有帮助!

历史

这是本文的初稿。

© . All rights reserved.