状态机例子

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

WF 状态机工作流构建订单处理流程-范例程序分析 Part 1

状态机工作流(State Machine Workflow)是以状态的变化为驱动而进行业务流转的,且一定需要人为的干预,而不像顺序类型工作流(Sequential Workflow)那样按照事先设计好的业务流程一步一步依次执行下去。

State活动有3种类型的状态:起始状态(Initial State)、业务逻辑过程状态、终止状态(Completed State),在一个状态机工作流中起始状态和终止状态只能有一个。状态机工作流是从起始状态开始执行,在运行过程中通过业务逻辑状态的变化来进行工作流的流转,最终由终止状态标志工作流的结束。因此在状态机工作流设计界面上只能添加State 状态活动,另外,在该状态中还可以添加一个或多个EventDriven 活动。下面通过一个订单处理流程的范例,详细介绍状态机工作流的使用。

下图简要描述了订单处理流程,你会发现许多地方需要用户参与或输入,来改变工作流。例如,财务部门依赖于支付情况来改变工作流,采购部门依赖于库存情况来改变工作流等等。

按照下面具体的操作步骤,一步一步实现上述状态机工作流演示程序。

1. 创建接口程序

由于状态机工作流中大量使用HandleExternalEvent 活动来接收应用程序的操作事件,从而改进该工作流上运行的业务实体的状态,因此需要定义一个接口程序作为工作流和应用程序之间沟通的桥梁。本范例程序中将通过接口中的7个事件来模拟状态机工作流的触发,接口IOrder.cs 如下所示。需要注意的是:我们引用System.Workflow.Activities,并且接口添加了[ExternalDataExchange]属性。

2. 创建Class Library项目,并添加State Machine Workflow(状态机工作流)文件。如下图所示。

在添加State Machine Workflow文件后,Workflow设计器自动打开。工作流的每一个State都有事件,因此在State Activity 添加EventDriven组件。

在事件Event触发后,State状态进入下一个状态。因此,双击EventDriven 组件,添加HandleExternalEvent组件和SetState组件,其中HandleExternalEvent定义监听的事件,SetState定义将进入的下一个状态。

按照上面的步骤,重复创建OrderPlaced、OrderApproved、OrderPending、OrderDelivered、OrderCancelled状态,并添加相应的EventDriven组件,最终实现的状态机工作流如下所示:

WF 状态机工作流构建订单处理流程-范例程序分析 Part 2

状态机工作流(State Machine Workflow)是以状态的变化为驱动而进行业务流转的,且一定需要人为的干预,而不像顺序类型工作流(Sequential Workflow)那样按照事先设计好的业务流程一步一步依次执行下去。本范例程序由开源/C# 论坛小组提供。

WF 状态机工作流构建订单处理流程-范例程序分析Part 1

实现IOrder 接口

下面实现IOrder 接口,下面的代码Order类实现IOrder 接口。这里,仅仅在控制台显示一些简单的提示信息。该Order类将由Client端程序调用,其中内部的调用,将触发工作流中相应的活动。

创建工作流实例

下面基于workflow runtime 创建并启动工作流实例,并添加Order 对象作为服务。

WorkflowInstance objWorkFlowInstance;

WorkflowRuntime objWorkFlowRuntime = new WorkflowRuntime();

Order objOrder = new Order();

ExternalDataExchangeService objService = new ExternalDataExchangeService();

Guid InstanceId = Guid.NewGuid();

objWorkFlowRuntime.AddService(objService);

objService.AddService(objOrder);

objWorkFlowInstance =

objWorkFlowRuntime.CreateWorkflow(typeof(OrderWorkFlow.WorkflowOrder), null, InstanceId);

objWorkFlowInstance.Start();

Console.WriteLine("工作流启动啦-- Work flow started");

下面是Client端调用代码,根据用户输入的数值,调用Order 对象的相应方法,触发工作流中相应的活动。

ExternalDataEventArgs objDataEventArgs = new

ExternalDataEventArgs(InstanceId);

objDataEventArgs.WaitForIdle = true;

Console.WriteLine("1 - 订单尚未付款");

Console.WriteLine("2 - 产品入库");

Console.WriteLine("3 - 对订单付款");

Console.WriteLine("4 - 订单发货");

Console.WriteLine("5 - 送货地址错误");

Console.WriteLine("6 - 送货地址正确");

Console.WriteLine("7 - 产品有库存");

Console.WriteLine("请输入上述数字: ");

int intValueEntered=0;

while(intValueEntered < 7)

{

intValueEntered = Convert.ToInt16(Console.ReadLine().ToString());

if (intValueEntered == 1)

{

objOrder.CallNotPaid(objDataEventArgs);

}

else if (intValueEntered == 2)

{

objOrder.CallInStock(objDataEventArgs);

}

else if (intValueEntered == 3)

{

objOrder.CallPaymentMade(objDataEventArgs);

相关文档
最新文档