技术开发 频道

详解Visual Studio顺序型工作流的创建

  【IT168 技术文档】方便起见,许多在本次练习中将用到的代码段可以通过Visual Studio代码段得到. 这次实验所需要的安装将会安装这些代码段。需要作如下步骤:

  1. 运行位于本次实验Setup 目录下的IntroToWF4Lab.vsi安装文件。

  2. 根据向导的指示完成代码段安装。

  本次实验包括以下练习。这些练习按顺序进行。每个练习下的Begin文件夹里有一个解决方案。你可以通过打开这个解决方案开始特定的练习。

  初始化

  • Visual Studio解决方案。 根据不同的练习,你可以找到相应的Visual Studio C#和Visual Basic解决方案。这个解决方案是练习的起点。

  如果我遇到困难怎么办?

  在每个练习中,你都能找到一个能够正确运行的最终方案,它可以帮助你找到完成练习的正确步骤。

  记得在打开任何使用工作流设计器的文件前编译解决方案。

  工作流执行一个业务流程。流程的每一步用一个活动来实现。在这个练习中,你将用Windows Workflow Foundation创建和测试一个简单的“Hello Workflow” 流程。

  创建一个简单的“Hello Workflow” 应用程序

  在这个任务中你将 创建一个很简单的工作流对应于以下代码:

  private static void SayHello()
  {
  Console.WriteLine(
"Hello Workflow 4");
  }
  Visual Basic
  Private Shared Sub SayHello()
  Console.WriteLine(
"Hello Workflow 4")
  End Sub

 

  1. 从Start | All Programs | Microsoft Visual Studio 2010 启动 Microsoft Visual Studio 2010.

  2. 选择 File / New Project Ctrl+Shift+N 并设置项目如下:

  ·Installed Templates: 选择 Visual C# 或 Visual Basic。 然后在所选语言下选 Workflow

  ·Template: Workflow Console Application

  ·Name: HelloWorkflow.

  ·Location: %TrainingKitInstallFolder%\Labs\IntroToWF\Ex1-HelloWorkflow\Begin

  ·Solution: HelloWorkflow

  创建一个新的 Workflow Console Application (C#)

  创建一个新的Workflow Console Application (Visual Basic)

  3. 由于我们的业务流程是一个单阶段流程,我们可仅加一个WriteLine 活动来实施这个流程。从 Toolbox, 拖一个 WriteLine 活动放在设计图面.

  加 WriteLine 活动

  注意:如Toolbox窗口未出现,从View菜单选Toolbox。

  4. 把 WriteLine Text 属性设成"Hello Workflow 4".

  设置Text 属性

  WriteLine 活动

  WriteLine 活动是一个简单的活动在控制台显示一个消息。它的Text属性是一个表达式,可以是一个函数的结果或一个目标的属性值。在本例中,表达式是一个字符串,所以需加引号。

  验证

  为了验证你已完成练习1的所有阶段,执行以下步骤:

  1. 按 CTRL+F5 编译并无调试运行。你的应用程序应在控制台运行并打印消息“Hello Workflow 4”.

  完成的 HelloWorkflow 应用程序

  The CodeActivity

  至此我们已经看到,WF4是由一个编辑.xaml文件的设计器和一个执行活动的运行时组成。当你写一个工作流时,你实际上是编译成一种新的活动。而活动只不过是从System.Activities.Activity或它的子类继承下来的类,所以你也可以用C#, VB或XAML来写工作流。在这个练习中,我们将用C#或VB来编写活动,用于实现我们的“问候”商务流程。

  之前我们说活动是用于实现商务流程的。有些活动通过调用其它活动来实现流程。比如我们的SayHello活动没有直接向控制台写文字,而是通过调用WriteLine活动来达到目的。我们也可以用C#或VB来继承System.Activities.Activity, 然后向如下代码一样给Implemenantation赋值,来实现同样的SayHello活动:

  public sealed class SayHelloActivity : Activity
  {
  WriteLine writeLine
= new WriteLine() { Text = "Hello Workflow 4" };
  
public SayHelloActivity()
  {
  Implementation
= () => { return writeLine; };
  }
  }
  Visual Basic
  Public NotInheritable Class SayHelloActivity
  Inherits Activity
  Private writeLine As New WriteLine With {.Text
= "Hello Workflow 4"}
  Public Sub New()
  Implementation
= Function()
  Return writeLine
  End Function
  End Sub
  End Class

 

  如果你的工作流逻辑可以通过调用其它活动来实现,以上的方式是适用的。但有些时候你需要你的活动自己来实现商务逻辑,或者调用不是活动的类来做些工作。要达到这样的目的,你需要继承另一个类System.Activities.CodeActivity,然后重写Execute方法。

  步骤0—打开解决方案

  1. 从Start | All Programs | Microsoft Visual Studio 2010 启动Microsoft Visual Studio 2010

  2. 打开位于%TrainingKitInstallFolder%\Labs\ IntroToWF\Ex3-CodeActivity\Begin里的初始方案,作为本练习的开始。

  3. 按CTRL+SHIFT+B编译整个方案

  步骤 1 – 编写SayHelloInCode活动

  在这一步,你将通过代码形式来写这个活动,而且直接用Console.WriteLine将文字写到控制台。

  1. 右键点击HelloWorkflow项目,选择Add / New Item。从Workflow模板中选择Code Activity,然后将它命名为SayHelloInCode.

  2. 把Text属性从模板里删除—你现在不需要它。

  3. CodeActivity是一个抽象类。所以在你继承它之后,必须要重写Execute方法。这将是你实现活动功能的地方。把缺省的实现这个类的代码用下面的代码替换掉。

  (代码段 - Introduction to WF4 Lab - SayHelloInCode Class CSharp)

  public sealed class SayHelloInCode : CodeActivity
  {
  
protected override void Execute(CodeActivityContext context)
  {
  Console.WriteLine(
"Hello Workflow 4 in code");
  }
  }
  (Code Snippet
- Introduction to WF4 Lab - SayHelloInCode Class VB)
  Visual Basic
  Public NotInheritable Class SayHelloInCode
  Inherits CodeActivity
  Protected Overrides Sub Execute(ByVal context As CodeActivityContext)
  Cosole.WriteLine(
"Hello Workflow 4 in code")
  End Sub
  End Class

 

  步骤2 – 修改Main来调用SayHelloInCode

  1.修改Program.cs (C#)或Module1.vb (Visual Basic)来调用新建的SayHelloInCode类。首先在文件里找到WorkflowInvoker.Invoke, 然后照下面的代码替换。

  (代码段- Introduction to WF4 Lab - InvokeSayHelloInCode Class CSharp)

  static void Main(string[] args)

  {

  WorkflowInvoker.Invoke(
new SayHelloInCode());

  }

  (Code Snippet
- Introduction to WF4 Lab - InvokeSayHelloInCode Class VB)

  Visual Basic

  Shared Sub Main(ByVal args() As String)

  WorkflowInvoker.Invoke(New SayHelloInCode())

  End Sub

 

   Verification

  1.按CTRL+F5在非调试模式下运行工作流。你的程序应该在控制台里运行,而且输出“Hello Workflow 4 in code”.

  完成了的HelloWorkflow 应用程序

  为什么写code activity?

  用代码来实现商务逻辑已经不是新鲜事。为什么还要花功夫继承一个特殊的CodeActivity类?原因是这样你写的逻辑就可以被包含进其它更大的用工作流引擎运行的商务流程中去。而且正如之后我们还会看到,这还能使它受益于一个能够提供高度扩展性和支持长期运行应用程序的线程和数据管理模式。

  Dynamic Workflows with XAML(XAML动态工作流)

  到现在为止,我们用.xaml, .cs 或.vb文件建立了工作流。这些文件都会被编译成类后包含在项目程序集中,然后被工作流运行时运行。虽然看上去好像文件的格式无关紧要,其实.xaml文件相比用C#或VB写工作流有独特的优势。

  ·工作流设计器只能基于.xaml文件,所以用C#或VB写的工作流没有设计器支持。

  ·XAML可以在不被编译进程序集的情况下动态的被加载和运行。

  步骤0—打开解决方案

  你可以选择继续使用上一个练习完成后的解决方案,或照一下步骤来开始本练习。

  1. 从Start | All Programs | Microsoft Visual Studio 2010 启动Microsoft Visual Studio 2010

  2. 打开位于%TrainingKitInstallFolder%\Labs\ IntroToWF\Ex4-CodeActivity\Begin里的初始方案,作为本练习的开始。

  3. 按CTRL+SHIFT+B编译整个方案

  步骤1-- 修改SayHello.xaml文件属性

  在这一步你将修改HelloWorkflow 程序来加载和运行SayHello.xaml文件。然后我们把SayHello.xaml里的text改掉,并在下一次运行程序时观察输出信息的改变。

  1. 我们先要让Visual Studio把SayHello.xaml当作已部署的内容来对待,而不是当成代码。方法如下

  · 在Solution Explorer选择SayHello.xaml,做以下设置

  · Build Action: Content

  ·Copy To Output Directory: Copy Always

  · 把 Custom Tool 设为 空

  Change the properties of SayHello.xaml to treat it as content

  步骤2—修改Main()来加载SayHello.xaml文件

  之前我们的工作流是被编译成一个类的。如果我们要直接从.xaml文件调用工作流,我们必须用ActivityXamlServices 把.xaml文件读进内存并建立一个让WorkflowInvoker可以调用的活动实例。要记住任何我们的.xaml文件引用的程序集在工作流被调用时一定要存在并能使用。

  1.把下列命名空间加入program.cs或Module1.vs文件

  using System.Activities.XamlIntegration;
  Visual Basic
  Imports System.Activities.XamlIntegratio

  2.修改program.cs或Module1.vb去调用ActivityXamlServices,并添加Console.ReadKey的调用,这样能更容易的观察我们的程序在Windows Explorer中的运行。

  (代码段- Introduction to WF4 Lab - ActivityXamlServices CSharp)

  static void Main(string[] args)
  {
  WorkflowInvoker.Invoke(ActivityXamlServices.Load(
"SayHello.xaml"));
  Console.ReadKey(
false);
  }
  (Code Snippet
- Introduction to WF4 Lab - ActivityXamlServices VB)
  Visual Basic
  Shared Sub Main()
  WorkflowInvoker.Invoke(ActivityXamlServices.Load(
"SayHello.xaml"))
  Console.ReadKey(False)
  End Sub

 

  验证

  在这次验证过程中,你会先运行HelloWorld程序,然后修改在bin\Debug文件夹下已经部署了的SayHello.xaml文件, 之后我们来看新的文字是否出现在控制台里。

  1.按CTRL+F5在非调试模式下运行工作流。你的程序应该在控制台里运行,而且输出“Hello Workflow 4”.

  2.在Bin\Debug目录下找到SayHello.xaml

  Locate the SayHello.xaml file in the project’s Bin\Debug directory

  3. 按SayHello.xaml右键菜单,选择Edit在Notepad中打开文件。

  Right click and select Edit

  4. 在Notepad中把WriteLine活动的Text属性的值改为“Hello Workflow 4 XAML”, 保存并关闭文件。

  Change the Text property in Notepad

  5. 从Windows Explorer运行HelloWorkflow.exe。 现在它应该显示”Hello Workflow4 from XAML”. 随便按个键退出。

  HelloWorkflow.exe showing a new message from the .xaml file

  6.回到Visual Studio, 把之前在SayHello.xaml上改过的设置恢复成初始状态, 这样可以进行之后的练习

  ·Build Action: XamlAppDef

  ·Copy to Output Directory: Do not copy

  ·Custom Tool: MSBuild:Compile

  Restore SayHello.xaml to the default properties for .xaml files

  注意!

  在Visual Studio 2010 Beta 2 里有可能找不到XamlAppDef Build Action。 如果你遇到这种情况,右键击中HelloWorkflow 项目,选择Add/New Item, 然后选Workflow/Activity来添加Activity.xaml. 之后XamlAppDef Build Action 就会出现了。

  在Solution Explorer里,选中SayHello.xaml并把它的build action 设为XamlAppDef. 之后你可以从项目中删掉Activity.xaml.

0
相关文章