您的位置:首页 > 其它

(转载)Windows workflow foundation(二)——(创建状态机工作流)(上)

2005-12-31 21:43 513 查看
状态机工作流是为事件驱动的工作场景设计的。一个状态机工作流包含两个或两个以上的状态,且任意时刻只有一个处于激活状态。在这一节中,我们将创建一个基于状态机的工作流,这个工作流将通过其内部不同的状态,来处理宿主程序提交的订单。初始状态为WaitForOrderState,只要宿主程序提交了一个新订单,这个状态就会执行。当收到一个新订单后,进入OrderProcessing状态开始处理订单。最后一个状态就是OrderCompletedState。在这个过程中,不同的状态将会与宿主程序交互。



创建一个状态机工作流[/b]

一个状态机工作流可以继承从StateMachineWorkflow类,这个类中已经实现了状态机工作流的大部分功能。一旦你继承了这个类,你就可以开始在工作流中加入所需的状态,并使用SetState活动或事件驱动的活动如EventSink把这些状态连接起来。以下的代码就是我们的工作流类OrderProcessingWorkflow,这个类是接下来整个示例程序的基础。你可能已经注意到了,类中声明了两个变量。这两个变量是用来存贮当前订单信息的,这些信息将会在整个流程中用到。

using System;
using System.Workflow.ComponentModel;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;

namespace Microsoft.Samples.Workflow.Quickstarts.StateMachine

创建活动和参数绑定

WWF中有两个类ActivityBind和ParameterBinding,是专门用来将活动中的变量,绑定到方法调用所需的参数上的。这个方法定义在一个接口中,接口的实现就是注册到工作流中的服务。在我们的程序中,我们将把当前订单的orderId和status的值传递进去。以下的代码示例了如何创建和联系工作流的私有变量和参数。这些参数将用来根据当前工作流的状态来更新宿主。在稍后创建状态活动时,我们将用到这些绑定对象。

开始创建活动和参数绑定[/b]

1. 定义一个私有变量

类型

名称

ActivityBind

orderIdActivityBind

ParameterBinding

orderIdParameterBinding

ActivityBind

itemStatusActivityBind

ParameterBinding

itemStatusParameterBinding

2. 以下代码示例了如何创建ActivityBind和ParameterBinding,以及怎样和私有变量绑定。

//
// Binding variables
//
orderIdActivityBind = new ActivityBind();
orderIdParameterBinding = new ParameterBinding();
itemStatusActivityBind = new ActivityBind();
itemStatusParameterBinding = new ParameterBinding();

orderIdActivityBind.ID = "/Workflow";
orderIdActivityBind.Path = "orderId";
orderIdParameterBinding.ParameterName = "orderId";
orderIdParameterBinding.SetBinding(System.Workflow.ComponentModel.ParameterBinding.ValueProperty,
((System.Workflow.ComponentModel.Bind)(orderIdActivityBind)));

itemStatusActivityBind.ID = "/Workflow";
itemStatusActivityBind.Path = "itemStatus";
itemStatusParameterBinding.ParameterName = "newStatus";
itemStatusParameterBinding.SetBinding(System.Workflow.ComponentModel.ParameterBinding.ValueProperty,
((System.Workflow.ComponentModel.Bind)(itemStatusActivityBind)));

构造WaitingForOrder[/b]状态[/b]

这第一个状态监听来自宿主的事件,这个事件通知工作流一个新的订单已经被提交了,应该马上处理它。当你创建状态时,状态的第一个子活动必须是StateInitialization活动或实现了IEventActivity接口的活动。这里的WaitForOrderState采用了后者,因为这个状态是由宿主程序的事件激活的。

EventSink活动是用来监听注册在WWF运行库中的服务的事件的,在我们的程序中,这个服务由宿主程序提供。我们在工作流中定义了IOrderingService接口,这个接口稍后将由宿主程序实现。

using System;
using System.Workflow.ComponentModel;
using System.Workflow.Runtime.Messaging;

namespace Microsoft.Samples.Workflow.Quickstarts.StateMachine
//
// WaitingForOrder State
//
this.newOrderEventSink = new System.Workflow.Activities.EventSinkActivity();
this.newOrderEventSink.EventName = "NewOrder";
this.newOrderEventSink.ID = "newOrderEventSink";
this.newOrderEventSink.InterfaceType = typeof(Microsoft.Samples.Workflow.Quickstarts.StateMachine.IOrderingService);
this.newOrderEventSink.Roles = null;

this.updatestatusOrderReceived = new System.Workflow.Activities.InvokeMethodActivity();
this.updatestatusOrderReceived.ID = "updatestatusOrderReceived";
this.updatestatusOrderReceived.InterfaceType = typeof(Microsoft.Samples.Workflow.Quickstarts.StateMachine.IOrderingService);
this.updatestatusOrderReceived.MethodName = "ItemStatusUpdate";
this.updatestatusOrderReceived.ParameterBindings.Add(orderIdParameterBinding);
this.updatestatusOrderReceived.ParameterBindings.Add(itemStatusParameterBinding);
this.updatestatusOrderReceived.MethodInvoking += new System.EventHandler(this.OrderReceived);

this.setStateOrderProcessing = new System.Workflow.Activities.SetState();
this.setStateOrderProcessing.ID = "setStateOrderProcessing";
this.setStateOrderProcessing.TargetState = "OrderProcessingState";

this.eventDriven1 = new System.Workflow.Activities.EventDriven();
this.eventDriven1.Activities.Add(this.newOrderEventSink);
this.eventDriven1.Activities.Add(this.updatestatusOrderReceived);
this.eventDriven1.Activities.Add(this.setStateOrderProcessing);
this.eventDriven1.ID = "eventDriven1";

this.WaitingForOrderState = new System.Workflow.Activities.State();
this.WaitingForOrderState.Activities.Add(this.eventDriven1);
this.WaitingForOrderState.ID = "WaitingForOrderState";

你可以在InvokeMethodActivity活动执行的前一刻,加入一些附加的逻辑。只要为MethodInvoking事件指定一个处理程序,就能做到这一点。以下的代码就是MethodInvoking事件的处理程序。它为itemStatus和orderId变量指定了新的值。事件处理程序的指定,已经在上面的代码中做了。

private void OrderReceived(object sender, EventArgs e)
{
itemStatus = "Received order";
orderId = Guid.NewGuid().ToString();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐