EntLib.com 专业电子商务平台

基于Microsoft .Net Framework / ASP.Net / C# / AJAX 平台构建的标准电子商务系统
随笔 - 99, 评论 - 74, 引用 - 0

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

WF 状态机工作流构建订单处理流程-范例程序分析 Part 2
 
状态机工作流(State Machine Workflow)是以状态的变化为驱动而进行业务流转的,且一定需要人为的干预,而不像顺序类型工作流(Sequential Workflow)那样按照事先设计好的业务流程一步一步依次执行下去。本范例程序由http://forum.entlib.com 开源ASP.NET/C# 论坛小组提供。
 
 
实现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);
                }
                else if (intValueEntered == 4)
                {
                    objOrder.CallDispatch(objDataEventArgs);
                }
                else if (intValueEntered == 5)
                {
                    objOrder.CallAddressNotProper(objDataEventArgs);
                }
                else if (intValueEntered == 6)
                {
                    objOrder.CallAddressCorrected(objDataEventArgs);
                }
                else if (intValueEntered == 7)
                {
                    objOrder.CallProductStocked(objDataEventArgs);
                }
            }
该工作流演示界面如下:
 

 
欢迎下载该范例程序源代码。
 

 点击下载 下载Workflow范例程序 (111 KB)

 打印 | 评论 (2) | posted on 2009年6月2日 19:43 | 目录 [ Workflow (WF) ]

评 论

# 建议

为什么不用switch case?
虽效率差不多,起码简洁,看起来舒服
2009/6/14 11:45 | Kurdo

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

Kurdo, 你的建议很好。
2009/6/15 11:26 | entlib

发表评论

标题  
姓名  
Email
主页
评论内容   
Please add 5 and 2 and type the answer here: