Windows Workflow HOL学习笔记(十二):创建状态基工作流
Windows Workflow HOL学习笔记(十二):创建状态基工作流
本文内容来自Microsoft Hands-on Labs for Windows Workflow Foundation中的HOL04中的第一个练习,其中包括八个任务:
添加一个验证来检查Email参数。
Ø 创建一个新的State Machine Workflow Project
Ø 定义订单状态基工作流的状态
Ø 定义工作流变量
Ø 定义WaitingForOrderState
Ø 定义OrderOpenState
Ø 定义OrderProcessedState
Ø 添加OrderApplication Project
Ø 测试状态基工作流
在这个练习中,将创建一个状态基工作流来管理订单。可以想象在一个电子商务应用中,一个订单在完成之前经历的许多状态。在这个例子中,定义下面四个状态:
WaitingForOrderState
OrderOpenState
OrderProcessedState
OrderCompletedState
在这个订单系统中还具有规则来指定根据订单当前的状态触发相应的事件。例如,一个open的订单可以被updated,processed,canceled,shipped。尽管如此,一个在processed状态下的订单只能被updated和shipped,但是不能被canceled。当一个事件发生后,状态基工作流可以随意的转换订单的状态。例如,当一个open的订单触发了OrderShipped事件,状态基工作流将把这个订单的状态转换为completed。这个简单状态基工作流的状态和转换如下图所示:
我们将使用来State activity建模订单的状态开始创建这个订单的状态基工作流。我们将在订单事件中使用EventDriven activities和custom activities来指定每一个状态将触发哪个event。在大多数情况下,当一个订单事件触发后,将使用SetState activity来转换订单的状态。最后,在完成这个状态基工作流后,我们将使用前面的Windows Forms host测试这个工作流。
1.创建一个State Machine Workflow Library项目。
Name:OrderWorkflows
Location:C:\Windows Workflow Foundation\Labs\Lab04
2.在这个项目上添加一个引用。浏览到如下目录:
C:\Windows Workflow Foundation\Labs\Lab04\Resources\bin
添加OrderLocalServices.dll组件。
任务一完成。
3.在工作流设计器中选择Workflow1InitialState,修改Name属性为WaitingForOrderState。
4.在这个状态基工作流的设计视图上,我们会在右上角看到一个红色的叹号,用鼠标移到上面后会出现一个小的下拉箭头,点击后会出现如下提示:
5.在整个工作流的属性窗口中,找到InitialStateName属性。或者点击这个错误信息会直接定向到这个位置。我们将这个属性修改为刚才重命名的WaitingForOrderState。从这个属性的下拉菜单中也可以选择到这个活动。这一步是设置整个状态基工作流的初始化状态,等待订单。
6.从工具箱中找到State activity,再拖一个放到设计视图中。修改它的Name属性为OrderOpenState。打开订单。
7.再添加一个State activity,Name属性为OrderProcessedState。表示订单正在流转的过程中。
8.再添加一个State activity,Name属性为OrderCompletedState。表示订单完成。
9.完成后效果图如下:
10.点击空白处选中整个状态基工作流。在属性窗口中设置整个工作流的完成状态属性CompletedStateName为订单完成的OrderCompletedState。
任务二完成。
11.切换到的Workflow1.cs代码视图。定义需要的工作流变量。
private string orderCanceledError = "Order has been canceled";
public string OrderCanceledError
{
get { return orderCanceledError; }
}
工作流中订单被取消时给出的提示信息。
任务三完成。
12.打开Workflow1.cs设计视图。定义WaitingForOrderState。
13.在工具箱中找到EventDriven activity(事件驱动活动),拖一个放到WaitingForOrderState中。Name属性为OrderCreatedEvent。订单创建事件。
14.双击OrderCreatedEvent活动,设计器将显示EventDriven的内容。
15.在其中添加一个HandleExternalEvent活动。首先设置InterfaceType属性,在弹出的窗口中选择刚才添加的OrderLocalServices组件,右边窗口会列出可选择的接口,这里选择IOrderService。这样就定义好了这个调用的接口类型。
然后设置EventName属性,设置好接口后,就可以从这个接口中选择对应的事件了。
现在对应的是订单的创建,我们选择OrderCreated。
16.选择OrderCreated事件后,属性窗口中会多出两个属性参数,e和Sender。设置属性e,在弹出的窗口中选择“绑定到新成员”选项卡,新成员名称为OrderEvtArgs。
设置sender属性,同样绑定到新成员,名称为OrderSender。
17.从工具箱中找到SetState activity,在OrderCreatedEvent中的HandleExternalEvent下面添加一个。(订单创建完毕后要设置状态,将订单转换下一个状态)修改TargetStateName属性为OrderOpenState。(即订单的下一个状态为OrderOpenState)
18.切换回工作流的设计视图。或者,也可以使用Document Outline(文档大纲)工具窗口来以树型结构的方式查看整个工作流。通过菜单中的视图——其他窗口——文档大纲可以打开。
注释:下面的任务中,我们将添加更多的event handlers(事件处理)和state transitions(状态转换)。所有的事件都是用同样的代码和同样的参数,所以我们将复制粘贴EventDriven活动并修改一些属性来代替全部重新创建它们。
任务四完成。
19.复制WaitingForOrderState中的OrderCreatedEvent。在OrderOpenState中粘贴。粘贴后将自动打开的EventDriven设计视图。修改OrderUpdatedEvent属性为Name。
20.选中HandleExternalEvent,修改EventName属性为OrderUpdated。
属性e设置为OrderEvtArgs。
属性sender设置为OrderSender。
21.设置SetState活动的目标状态为OrderOpenState。
22.整个工作流设计视图的效果如下:
23.重复上面的步骤,复制WaitingForOrderState中的OrderCreatedEvent。粘贴到OrderOpenState中。修改Name属性为OrderProcessedEvent。
24.修改HandleExternalEvent的EventName属性为OrderProcessed。
25.同上设置参数e和sender分别绑定到Workflow1.OrderEvtArgs和Workflow1.OrderSender。
26.选中OrderProcessedEvent的状态转换连接线,将其结束端用鼠标拖动连接到OrderProcessedState。
任务五完成。
27.拷贝OrderOpenState中的OrderUpdatedEvent。将其粘贴到OrderProcessedState中,在自动打开的详细设计视图中,修改Name属性为OrderUpdatedEvent2。
28.拷贝WaitingForOrderState中的OrderCreatedEvent。将其粘贴到OrderProcessedState中。修改Name属性为OrderCanceledEvent。
29.在打开的详细设计视图中修改HandleExternalEvent的EventName属性为OrderCanceled。绑定相应的参数e和sender到Workflow1.OrderEvtArgs和Workflow1.OrderSender。
30.删除其中的SetState活动。在原来的位置上添加一个Terminate活动。设置它的Error属性为Workflow1.OrderCanceledError。
31.拷贝WaitingForOrderState中的OrderCreatedEvent。将其粘贴到OrderProcessedState中。设置属性Name为OrderShippedEvent。
32.修改HandleExternalEvent活动的EventName属性为OrderShipped。绑定相应的参数e和sender到Workflow1.OrderEvtArgs和Workflow1.OrderSender。
33.我们需要制作一个Invoked handler来演示这个用途。在Invoked属性中输入OrderShipped_Invoked。按下回车键将自动跳转到代码视图中相应的事件处理部分。在这里添加一个断点。
34.先回到工作流的设计视图修改SetState活动的TargetStateName属性为OrderCompletedState。设置完成后整个工作流的设计视图如下:
35.双击WaitingForOrderState状态中的OrderCreatedEvent事件活动。选中HandleExternalEventActivity并查看属性。在Invoked属性中输入OrderCreated_Invoked并按回车键。这样会切换到对应事件处理程序的代码视图。在这个位置我们插入一个断点。
任务六完成。
在前面的任务中我们创建并设计了一个订单管理的工作流。现在我们需要创建一个host application,它可以调用我们设计的这个工作流,也可以给工作流实例发送相应的事件。
创建一个Windows Forms application,用它来提供一些选项并调用工作流中所有的事件。这个应用也会显示出订单和它相应的状态。
36.打开如下路径:
C:\Windows Workflow Foundation\Labs\Lab04\Resources
将OrderApplication目录整个拷贝到如下路径中
C:\Windows Workflow Foundation\Labs\Lab04\OrderWorkflows
在菜单中选择文件——添加——现有项目,将这个项目添加到现在的解决方案中。
37.在解决方案浏览器窗口中选择OrderApplication,展开引用文件夹,删除OrderLocalServices和OrderWorkflows的引用。
38.从以下路径添加OrderLocalServices.dll的引用。
C:\Windows Workflow Foundation\Labs\Lab04\Resources\bin
39.添加OrderWorkflows项目的引用。
任务七完成。
39.将OrderApplication设置为启动项目。按F5编译并运行OrderWorkflows。将弹出如下运行窗口。
40.输入一个OrderID然后点击Order Created(创建订单),这样将创建一个订单状态基工作流的实例,并触发OrderCreated(订单创建)事件。这时会进入到我们定义的订单创建的代码部分。
在列表中我们可以看到这个订单的状态。
41.在列表中选中这个订单,点击Order Processed按钮。将跳转到OrderShipped_Invoked事件中。
42.调试完毕,结束。
任务八完成。
参考资料:
Microsoft Hands-on Labs for Windows Workflow Foundation
http://www.cnblogs.com/Bear-Study-Hard/category/78772.html
http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/episode.aspx?newsID=1242443