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





1.00/5 (1投票)
使用 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 会话中运行。
现在,让我们快速动手吧……
- 打开 VS 2008,从“文件”菜单中选择“新建项目”,然后选择“控制台应用程序”,再给它起个名字。(在右侧的“解决方案资源管理器”面板中,选择解决方案节点,然后从菜单中选择“文件 - 另存为解决方案”,以便在您选择的文件夹下更好地定位解决方案和项目文件。)
- 一个名为Program.cs的默认骨架类已为您创建。在右侧的“解决方案资源管理器”窗口中选择“引用”,然后右键单击以添加对以下 WF .NET 类库的引用:
System.Workflow.Runtime
、System.ComponentModel
和System.Workflow.Activities
。 - 从本文附带的解决方案中,复制并粘贴Program.cs C# 源文件的代码。(暂时忽略可能出现的任何编译错误。)
- 在“解决方案资源管理器”窗口中,选择“项目”节点,然后右键单击“添加新项”,类型为 C# 类。将其命名为
SequentialWorkflow
。 - 从本文附带的解决方案中,复制并粘贴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 以及IfElseActivity
、IfElseBranchActivity
和CodeActivity
。
希望这对某人有帮助!
历史
这是本文的初稿。