找了3个关于ASP.NET下运行WF的实例,并且都在自己的电脑上运行成功。其中两个是在网上找到,地址分别是:
WF (Windows Workflow Foundation) 工作流学习(一)一个Asp.Net状态机验证程序和
WF (Windows Workflow Foundation) 工作流学习(二)一个Asp.Net与顺序工作流结合的例子
这个两个例子分别介绍了如何使用状态机工作流和顺序工作流在asp.net下运行。两个实例都非常简单。并没有讲的太深,不过通过这个例子我们知道wf和asp.net是可以结合的,这是我们继续研究下去的动力。
第三个例子是从书上找到的,书名叫做《windows workflow foundation 新一代工作流开发事务》,在这本书的8.3节有一个结合ASP.NET应用程序开发WF的例子。(其实这个项目就是将WF官方提供的WF应用程序实例"OrderingStateMachine”修改了一下。WF代码实例可以从:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=35ec8682-d5fd-4bc3-a51a-d8ad115a8792&displaylang=en下载)我已经在自己的电脑上跑通,上面有一个比较好的地方就是能够通过WF来控制页面跳转。如下面四张图所示。
这是一个会员续约申请的工作流实例。开始工作流状态是“等待会员输入状态”,在图1中输入会员编号,然后点击“启动申请流程”,然后工作流会跳转到图2,在图2中点击“处理申请流程”以后工作流又会跳转到图3的状态。在图3中点击“申请完成回复”,工作流结束,这是会跳转到ProgessComplete.aspx页面。前面图1-3都是Default.aspx页面,图4跳转到了新页面,而这个跳转是工作流控制的。
图1
图2
图3
图4
1. 第三个案例项目整体架构
首先解释项目结构,结构如下图所示:
图 1
从上图中我们可以看到整个解决方案有两个项目组成,一个是ASP.NET Web应用程序WebApplication1,另一个是工作流类库WorkflowLibrary1。WebApplication1是项目的前台界面,它也作为工作流的宿主应用程序,因此我们会在WebApplication1中引用工作流类库WorkflowLibrary1。如下图所示:
图 2
2. 工作流类库WorkflowLibrary1分析
本案例是一个审批流程应用程序,一共分为四个状态,分别是:等待会员输入状态,启动申请单,申请单处理中和申请处理完毕。如下图所示。
图 3
在状态中添加EventDriven控件,如上图的PRCreatedEvent,然后在EventDriven中添加需要触发的外部事件HandelExternalEventActivity活动,如下图所示:
图 4
如上图所示,HandelExternalEventActivity1执行完以后,工作流会自动执行setStateActivity1,也就是变更工作流状态,将工作流状态从“等待会员输入状态”转移到“启动申请单”。这是由工作流状态之间的连线决定的。
每个HandelExternalEventActivity活动都需要配置其事件名EventName和接口类型InterfaceType。如下图所示:
图 5
而这些都在定义在IProgressService中,IProgressService相当于是定义一个契约,用它描述引入的事件与类型。比如在IProgressService中创建了工作流数据事件参数类OrderEventArgs,它继承自外部数据事件参数类:ExternalDataEventArgs;然后再创建一个工作流数据通信接口IProgressService,在其中定义了事件OrderCreated。
我们定义了一个契约,一个事件的参数类,以及为了工作流能够接收事件所需要的所有元数据。接下来就是需要讲到服务实现,服务实现写在ProgressService中,类ProgressService实现了IProgressService接口,在实现中定义了触发事件的处理过程。如方法:
public void RaiseProgressCreatedEvent(string orderId, Guid instanceId){}
3. WebApplication1宿主应用程序分析
WebApplication1是宿主应用程序,用于调用工作流类库。本实例中Default.aspx是表示层的首页,在Default.aspx.cs中定义了工作流执行逻辑。
首先,我们需要将ExternalDataExchangeService加入到运行时(WorkflowRuntime)中。ExternalDataExchangeService管理宿主的本地通信服务,在IProgressService中有如下定义:
[ExternalDataExchange]
public interface IProgressService
上面的[ExternalDataExchange]就是表示定义了本地的通信服务。
ManualWorkflowSchedulerService类提供一个线程服务,该服务允许创建工作流实例的宿主应用程序指定用于运行工作流实例的 Thread。 这是为了考虑多用户调用工作流实例的情况,我们只需要知道可以通过这个类的对象启动工作流实例即可。
ExternalDataExchangeService 类表示一个必须添加到工作流运行时引擎才能启用本地服务通信的服务。若要正确地初始化和注册这些服务,必需将本地服务实现添加到 ExternalDataExchangeService。我们的本地服务是ProgressService,因此在程序中会将ProgressService添加到ExternalDataExchangeService中,而ExternalDataExchangeService会添加到WorkflowRuntime中
ExternalDataExchange和ExternalDataExchangeService是配对使用的。只有定义了只有被标注为[ExternalDataExchange]的本地服务才能被添加到ExternalDataExchangeService中