状态机例子
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);