Microsoft Windows Workflow Foundation Step by Step Charpter 2

本文深入探讨了WorkflowRuntime的基础概念,介绍了其在应用程序中的部署方式及如何通过工厂模式管理单例,同时还详细阐述了WorkflowRuntime的主要属性和方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天学习了第二章,下在尝试着把这一章翻译出来

chapter 2 The workflwo runtime.

当你在WF(workflow foundation)中执行任务,我们必须察看一些东西既WorkflowRuntime。WorkflowRuntime开始于每一个Workflow任务。当执行任务时,在不同的状态下,WorkflowRuntime都会监视每一个事件。同样WorkflowRuntime还会监听我们在Workflow中所加的每一个服务。(我们会在第五章中讨论这些服务)

Workflow的加构图

Workflow同你的应用程序同时执行。实际上,Workflow要求你的应用程序做为一个宿主。这个宿主可以是windows Forms Application, aconsole application, an ASP.NET Web application or windows service。WorkflowRunTime同你的应用程序一起在AppDomain中执行,而且有且只有一个WorkflowRunTime在每一个AppDomain中。如果尝试创建第二个WorkflowRunTime在一个单独的AppDomain中会引起InvalidOperationException异常。

我们通过创建一组逻辑活动去建立Workflow 应用程序----“Workflow”。这些逻辑活动是未了完成你所要求的Workflow的任务。当你去建立一个WorkflowRunTime,本质上是希望去处理这些逻辑活动然后去执行他们。这就要运用Workflow instance。包含了一堆逻辑活动的Workflow instance在当前执行Workflow任务。当我们回忆第一章时,逻辑活动执行你所提供的代码并且根据输入数据做出决定。接下面一章来,我们就会介绍Workflow instances。

在你程序中建立Workflow

在上一章当中,我们通过VS2005去建立一个简单的Workflow程序。(....此段无关紧要)

因此如何在你的程序中建立一个Workflow。除了运行你的Workflow,你还需要添加Workflow引用,并提供必需的代码来执行Workflow。并进行管理。在这种情况下,添加Workflow引用同添加其他.NET引用一样。并且我们可以获取Workflow中的不同的状态,如闲置或者遇到了无法处理的异常。在随后,我们可以看到这里有一系列的异常我们可以处理,

Note Workflow可以在不同的程序中创建,包括Windows Forms, Windows Presentation Foundation application. console application. ASP.NET Web application, Windows Services。

现在,让我们来建立一个基于.NET console application的Workflow。这会帮助我们了解Workflow。

1.启动VS2005 。

2.在文件菜单中,选择新建然后选择工程。

3.展开C#,选择Windows

4.选择Consowl Application

5.在文件名中输入workflowHost

6.在文件路径中(自己决定)

7.点击OK

我们创建一个console application,但这没有什么有趣的。现在我们开始添加Workflow组件。但在此之前,我想说的是我非常喜欢VS2005的智能化设计,这样可以帮助我们自动的导入引用。

添加Workflow引用

1,在VS2005 solution中,右击Reference然后选择Add Reference.

2. 在Add reference对话框中,寻找System.Workflow.Runtimg并选择他。

3 单击OK

现在,VS2005就会添加在Workflow中所要用的引用。接下来,我们还需加入一些代码来让WorkflowRuntime工作。

建立WorkflowRuntime

1.在编辑器中打开program.cs

2.写入以下代码

using System;

using System.Collections.Generic;

using System.Text

3.在System.Text后添加下面代码

using System.Workflow.Runtimg;

4.在主函数中,添加下面代码

WorkflowRuntimg workflowRuntime = new WorkflwoRuntime();

5.现在,我们编译程序以确保没有错误。我们在本章当中都会运用到整个程序。

研究WorkflowRuntime

现在,我们在WorkflwoHost程序中拥有一个WorkflowRuntime实例。接下来我们就来研究WorkflowRuntime。就像其他类型一样,WorkflowRuntime也拥有一系列的方法我属性。图2-1是属性,图2-2是方法。

图2-1

属性                                          目的

IsStarted          用来确定WorkflowRuntime是否启动并准本接受Workflow instance. 在程序调用StartRuntimg 之前IsStarted为false,在程序调用StopRuntimg之前IsStarted为true。注意,我们不能添加核心服务党WorkflowRuntime在运行的时候

Name               获取或设置WorkflowRuntime的名字。你不能再WorkflowRuntime运行的时候来设置名字,否则会产生InvalidOperationException.

图2-2

方法                                         目的

AddService     添加指定的服务到WorkflowRuntime.会有有限的服务可以被添加

CreateWorkflow    建立Workflow instance,包括任何的指定的参数.如果WorkflowRuntime没有被开启,CreateWorkflow 会调用StartRuntime.

GetWorkflow         获取Workflow instance.

StartRuntime       开始WorkflowRuntime和WorkflowRuntime服务,并记录Started 事件

StopRuntime       停止WorkflowRuntime和WorkflowRuntime服务,并记录Stopped事件

除了比较常用的方法和属性,WorkflowRuntime还有其他的一些方法我们将在以后介绍. 在后面我们还将介绍在执行WorkflowRuntime中产生的不同的状态.基本上, 在调用WorkflowRuntime中必须包括使用一些简单的方法和处理一些事件.

建立WorkflowRuntime工厂

在这里,我在强调一遍,每一个AppDomain只能建立一个WorkflowRuntime.

无论在什么时候, 当我们听到"使用单独实例", 我自然会想到使用工厂模式和单独模式.这单独模式,就是一个机器来确定不论多少次在你程序中调用单个实例,只有一个实例会被初始化. 这会主要用于那些消耗很多资源的实例.

使用单独模式就是要在你程序中创建一个单独的实例. 而工厂模式.包括一个被用来去创建其他实例的媒介.例如,我们并不想去建立自己的车,而是我们从汽车厂那个购买.

单独模式同工厂模式结合起来是非常强大的.因为工厂可以保证只有一个实例会被创建.这正好满足我们的需要.因为在我们程序中,有不同的程序想创建WorkflowRuntime.让我们看一下如何去创建WorkflowRuntime工厂.

创建WorkflowRuntime工厂

1.我们需要添加WorkflowHost工程,右击工程名字,在Add menu选择Class

2.Class已经被选择上了,我们直接输入名字:WorkflwoFactory.cs

3.就像我们添加主程序那样,我们需要在WorkflowFactory上添加引用,

using System;

using System.Collections.Generic;

using System.Text;

using System.Workflow.Runtime;

4.我们使用using直接引入WorkflowRuntime引用到我们的文件中,而且,我们需要添加代码到WorkflwoFactory类中

class WorkflowFactory

{

}

并不算多的代码,但我们需要添加他

private static WorkflowRuntime _WorkflowRuntime = null;

private static object _syncRoot = new object();

private static object _syncRoot = new object();

5.注意_workflowRuntime被初始化为null.我们的工厂会识别这个并创建WorkflowRuntime实例. 如果WorkflowRuntime不为null, 我们的工厂就不会创建一个新的实例而是会使用存在的实例.因此,我们需要添加方法去实现创建一个实例.更重要的事,我们要使用静态方法,以至于不需要重新创建一个工厂的实例.

 

public static WorkflowRuntime GetWorkflowRuntime()
{
    
lock(_syncRoot)
   
{
       
if(null == _workflowRuntime)
      
{
          _workflowRuntime 
= new WorkflowRuntime();
      }

   }

}

 

6.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值