Windows workflow foundation(三)——(创建状态机工作流)(下)

来源:互联网 发布:lol美服登场数据 编辑:程序博客网 时间:2024/05/21 09:31
我们这个工作流的下一个状态就是OrderProcessingState。在这个状态中,工作流已经收到了订单,并准备好处理了。这个状态和上一个状态最大的不同就是激活方式。WaitForOrderState状态是宿主程序触发一个事件激活的,这个事件通知工作流一个新的订单需要被处理。而在OrderProcessingState状态是上一个状态由SetState转移而激活的。
这个例子中,我们只是简单的给宿主程序发送一个消息,告诉它定单已经处理完了。但实际情况会复杂的多。在宿主程序更新完订单状态之后,我们使用SetState活动,把状态转移到这个工作流的最后一个状态。
在上一个状态中,状态直到收到了一个宿主事件后才开始执行,在这之前,状态机是空闲的。而这个状态则是立即开始执行的。立即执行的状态需要使用StateInitialization活动。这个活动是一种组件活动(类似EventDriven),但它是当状态一激活就立即执行的。
 
开始构建OrderProcessingState
 
1. 定义5个私有变量
类型
名称
InvokeMethodActivity
invokeProcessingNewOrderStatusUpdate
InvokeMethodActivity
invokeOrderProcessedStatusUpdate
SetState
setStateOrderCompleted
StateInitialization
initializeOrderProcessingState
State
OrderProcessingState
2. 用默认构造函数实例化。
 
以下的代码演示了如何构造一个OrderProcessingState。两个InvokeMethodActivity分别更新宿主程序的状态,SetState活动把控制权转移到最后一个状态。
//
// OrderProcessing State
//
this.invokeProcessingNewOrderStatusUpdate = new System.Workflow.Activities.InvokeMethodActivity();
this.invokeProcessingNewOrderStatusUpdate.ID = "invokeProcessingNewOrderStatusUpdate";
this.invokeProcessingNewOrderStatusUpdate.InterfaceType = typeof(Microsoft.Samples.Workflow.Quickstarts.StateMachine.IOrderingService);
this.invokeProcessingNewOrderStatusUpdate.MethodName = "ItemStatusUpdate";
this.invokeProcessingNewOrderStatusUpdate.ParameterBindings.Add(orderIdParameterBinding);
this.invokeProcessingNewOrderStatusUpdate.ParameterBindings.Add(itemStatusParameterBinding);
this.invokeProcessingNewOrderStatusUpdate.MethodInvoking +=
    new System.EventHandler(this.ProcessNewOrder);
 
this.invokeOrderProcessedStatusUpdate = new System.Workflow.Activities.InvokeMethodActivity();
this.invokeOrderProcessedStatusUpdate.ID = "invokeOrderProcessedStatusUpdate";
this.invokeOrderProcessedStatusUpdate.InterfaceType = typeof(Microsoft.Samples.Workflow.Quickstarts.StateMachine.IOrderingService);
this.invokeOrderProcessedStatusUpdate.MethodName = "ItemStatusUpdate";
this.invokeOrderProcessedStatusUpdate.ParameterBindings.Add(orderIdParameterBinding);
this.invokeOrderProcessedStatusUpdate.ParameterBindings.Add(itemStatusParameterBinding);
this.invokeOrderProcessedStatusUpdate.MethodInvoking += new EventHandler(FinalizeOrder);
 
this.setStateOrderCompleted = new System.Workflow.Activities.SetState();
this.setStateOrderCompleted.ID = "setStateOrderCompleted";
this.setStateOrderCompleted.TargetState = "OrderCompletedState";
 
this.initializeOrderProcessingState = new System.Workflow.Activities.StateInitialization();
this.initializeOrderProcessingState.Activities.Add(this.invokeProcessingNewOrderStatusUpdate);
this.initializeOrderProcessingState.Activities.Add(this.invokeOrderProcessedStatusUpdate);
this.initializeOrderProcessingState.Activities.Add(this.setStateOrderCompleted);
this.initializeOrderProcessingState.ID = "initializeOrderOpenState";
 
this.OrderProcessingState = new System.Workflow.Activities.State();
this.OrderProcessingState.ID = "OrderProcessingState";
this.OrderProcessingState.Activities.Add(this.initializeOrderProcessingState);
 
正如你在上一个状态中所做的,我们还要为InvokeMethodActivity中的MethodInvoking事件指定两个事件处理函数。
private void ProcessNewOrder(object sender, EventArgs e)
{
    itemStatus = "Processing order";
}
 
private void FinalizeOrder(object sender, EventArgs e)
{
    itemStatus = "Order processed";
}
 
构造OrderCompleted状态
 
一个状态机工作流有两个必需的状态,一个初始状态,一个终止状态。我们要创建的最后一个状态就是终止状态OrderCompletedState。终止状态是工作流的最后一个状态,它不能包含任何子活动。
 
开始构造OrderCompletedState
 
1. 定义1个变量
类型
名称
State
OrderCompletedState
以下代码演示了如何创建最后一个状态。
//
// OrderCompleted State
//
this.OrderCompletedState = new System.Workflow.Activities.State();
this.OrderCompletedState.ID = "OrderCompletedState";
 
完成工作流类
 
到这里,状态机已经全部构建好了。最后一步就是把状态加到工作流中,并设好开始和终结状态。调用工作流类的Activities集合Add方法,把状态加到工作流中。加入的顺序无关紧要。在顺序工作流中,活动加入的顺序也并非是它执行的顺序;状态机工作流是通过事件触发和状态转移来驱动的,活动加入的顺序就更没关系了。
 
以下的代码演示了如何把状态加入工作流中,并将初始状态和结束状态属性分别设为各自的ID。
// Construct the workflow
this.DynamicUpdateCondition = null;
this.ID = "Workflow1";
this.Activities.Add(this.WaitingForOrderState);
this.Activities.Add(this.OrderProcessingState);
this.Activities.Add(this.OrderCompletedState);
this.InitialState = "WaitingForOrderState";
this.CompletedState = "OrderCompletedState";
 
创建宿主程序
 
示例中的宿主程序是一个WinForm程序。宿主程序中有一个可以选择订单项的列表框,一个填写项目数量的文本框。当用户点击提交按钮后,订单将被提交到工作流。工作流在处理订单的过程中会调用ItemStatusUpdate接口方法,来更新订单的状态。你应该还记得这个方法是IOrderingService接口的一个方法。这个接口将在HostOrderService类中实现。这个类会用WorkflowRuntimeAddService方法,加入到WWF引擎中。
(译者:为了能清晰的看到程序的脉络,我只列出关键的代码)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
 
using System.Windows.Forms;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
using System.Collections;
 
namespace Microsoft.Samples.Workflow.Quickstarts.StateMachineHost
{
    public partial class MainForm : Form
    {
        private HostOrderService myHost;
        private WorkflowRuntime workflowRuntime = null;
        ……
        public MainForm()
        {
            InitializeComponent();
            ......
            myHost = new HostOrderService();
            myHost.StatusUpdate += new HostOrderService.StatusUpdateDelegate(myHost_StatusUpdate);
            workflowRuntime = new WorkflowRuntime();
            workflowRuntime.AddService(myHost);
            workflowRuntime.StartRuntime();
        }
 
        private void myHost_StatusUpdate(object sender, ItemStatusUpdateEventArgs e)
        {
            ……
            if (cbOrderId.Items.Contains(e.OrderId) == false)
            {
               cbOrderId.Items.Add(e.OrderId);
            }
        }
 
        private void btnSubmit_Click(object sender, EventArgs e)
        {
            string item = cbItems.SelectedItem.ToString();
            int quantity = (int) udQuantity.Value;
 
            myHost.SubmitNewOrder(workflowRuntime, item, quantity);
        }
    }
 
    public class ItemStatusUpdateEventArgs : EventArgs
    {
        private string _status;
        private string _orderId;
 
        public ItemStatusUpdateEventArgs(string orderId, string status)
        {
            _status = status;
            _orderId = orderId;
        }
 
        public string OrderId
        {
            get { return _orderId; }
        }
 
        public string Status
        {
            get { return _status; }
        }
    }
 
    public class HostOrderService : StateMachineWorkflowQuickstart.IOrderingService
    {   
        public delegate void StatusUpdateDelegate( object sender, ItemStatusUpdateEventArgs e );
        public event StatusUpdateDelegate StatusUpdate;
 
        private WorkflowInstance curWorkflowInstance = null;
        private string _item;
        private int _quantity;
 
        public void SubmitNewOrder(WorkflowRuntime runtime, string item, int quantity)
        {
            _item = item;
            _quantity = quantity;
 
            // submit order to workflow and receive order id
            Type type = typeof(StateMachineWorkflowQuickstart.OrderProcessingWorkflow);
 
            curWorkflowInstance = runtime.StartWorkflow(type);
           
            // submit the order to the workflow
            NewOrder(null, new StateMachineWorkflowQuickstart.NewOrderEventArgs(curWorkflowInstance.InstanceId, item, quantity));
        }
 
        public void ItemStatusUpdate(string orderId, string newStatus)
        {
            StatusUpdate( this, new ItemStatusUpdateEventArgs( orderId, newStatus ));
        }
 
        public event EventHandler<StateMachineWorkflowQuickstart.NewOrderEventArgs> NewOrder;
 
        public void RetrieveOrderDetails(out string item, out int quantity)
        {
            item = _item;
            quantity = _quantity;
        }
    }
}
 
原创粉丝点击