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);
}
}
该工作流演示界面如下:
欢迎下载该范例程序源代码。