W
indows Workflow HOL学习笔记(十二):创建状态基工作流
本文内容来自Microsoft Hands-on Labs for Windows Workflow Foundation中的HOL04中的第一个练习,其中包括八个任务:
添加一个验证来检查Email参数。
Ø  创建一个新的State Machine Workflow Project
Ø  定义订单状态基工作流的状态
Ø  定义工作流变量
Ø  定义WaitingForOrderState
Ø  定义OrderOpenState
Ø  定义OrderProcessedState
Ø  添加OrderApplication Project
Ø  测试状态基工作流
<?XML:NAMESPACE PREFIX = O />
在这个练习中,将创建一个状态基工作流来管理订单。可以想象在一个电子商务应用中,一个订单在完成之前经历的许多状态。在这个例子中,定义下面四个状态:
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项目。
NameOrderWorkflows
LocationC:\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事件后,属性窗口中会多出两个属性参数,eSender。设置属性e,在弹出的窗口中选择“绑定到新成员”选项卡,新成员名称为OrderEvtArgs
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.修改HandleExternalEventEventName属性为OrderProcessed
25.同上设置参数e和sender分别绑定到Workflow1.OrderEvtArgsWorkflow1.OrderSender
26.选中OrderProcessedEvent的状态转换连接线,将其结束端用鼠标拖动连接到OrderProcessedState
任务五完成。
27.拷贝OrderOpenState中的OrderUpdatedEvent。将其粘贴到OrderProcessedState中,在自动打开的详细设计视图中,修改Name属性为OrderUpdatedEvent2
28.拷贝WaitingForOrderState中的OrderCreatedEvent。将其粘贴到OrderProcessedState中。修改Name属性为OrderCanceledEvent
29.在打开的详细设计视图中修改HandleExternalEventEventName属性为OrderCanceled。绑定相应的参数e和sender到Workflow1.OrderEvtArgsWorkflow1.OrderSender
30.删除其中的SetState活动。在原来的位置上添加一个Terminate活动。设置它的Error属性为Workflow1.OrderCanceledError
31.拷贝WaitingForOrderState中的OrderCreatedEvent。将其粘贴到OrderProcessedState中。设置属性NameOrderShippedEvent
32.修改HandleExternalEvent活动的EventName属性为OrderShipped。绑定相应的参数e和sender到Workflow1.OrderEvtArgsWorkflow1.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,展开引用文件夹,删除OrderLocalServicesOrderWorkflows的引用。
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

转载于:https://blog.51cto.com/bearstudyhard/298344

Windows Workflow HOL学习笔记(十二):创建状态基工作流相关推荐

  1. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  2. windows内核开发学习笔记十五:IRP结构

    windows内核开发学习笔记十五:IRP结构   IRP(I/O Request Package)在windows内核中,有一种系统组件--IRP,即输入输出请求包.当上层应用程序需要访问底层输入输 ...

  3. windows内核开发学习笔记十八:IRP 处理的标准模式

    windows内核开发学习笔记十八:IRP 处理的标准模式 在 Windows 内核中的请求基本上是通过 I/O Request Packet 完成的. I/O manager ---> Dis ...

  4. OpenCV学习笔记(十二)——图像分割与提取

    在图像处理的过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来.例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆.行人或者其他对象. ...

  5. Windows消息机制学习笔记(二)—— 窗口与线程

    Windows消息机制学习笔记(二)-- 窗口与线程 要点回顾 消息从哪里来? 实验一:Spy++捕获消息 实验二:消息捕获 消息到哪里去? 窗口在哪? 实验:分析CreateWindowExW 窗口 ...

  6. Windows事件等待学习笔记(二)—— 线程等待与唤醒

    Windows事件等待学习笔记(二)-- 线程等待与唤醒 要点回顾 等待与唤醒机制 可等待对象 可等待对象的差异 线程与等待对象 一个线程等待一个对象 实验 第一步:编译并运行以下代码 第二步:在Wi ...

  7. Polyworks脚本开发学习笔记(十二)-输出和读取文本文件

    Polyworks脚本开发学习笔记(十二)-输出和读取文本文件 Polyworks作为一个测量工具,将测量的数据方便的导出到文本文件则是一项必须的功能.在DATA_FILE这个命令下提供了很多子命令用 ...

  8. Windows内存管理学习笔记(二)—— 物理内存的管理

    Windows内存管理学习笔记(二)-- 物理内存的管理 物理内存 实验一:理解MmNumberOfPhysicalPages MmPfnDatabase _MMPFN 物理页状态 六个链表 实验二: ...

  9. Windows驱动开发学习笔记(二)—— 驱动调试内核编程基础

    Windows驱动开发学习笔记(二)-- 驱动调试&内核编程基础 基础知识 驱动调试 PDB(Program Debug Database) WinDbg 加载 PDB 实验:调试 .sys ...

最新文章

  1. 「图像分割模型」全景分割是什么?
  2. string 类型详解
  3. 七十六、 数据结构二叉树及其代码实现
  4. NET问答: 如何取消或中止 Task 执行 ?
  5. 陌陌的 Service Mesh 探索与实践
  6. 单词翻转(信息学奥赛一本通-T1144)
  7. mpvue开发坑点总结
  8. 日志分析工具Awstats实战之Nginx篇-分析结果静态化
  9. Visual Studio Code编辑器的实用插件和工作中实用的技巧
  10. 纸牌游戏程序设计要点(C语言)
  11. 驱动人生教你佳能打印机驱动程序无法使用怎么解决
  12. java 调用 fastreport,Winform中使用FastReport实现简单的自定义PDF导出
  13. 64位系统和32位系统区别
  14. php怎么获得今天的日期,PHP怎么获取今天、昨天、明天的日期-php教程
  15. APP和后端HTTP通信加密思路
  16. 利用MODIS TOOL批量重投影MODIS
  17. 备份 mysql数据
  18. Mysql(Centos7.9)2022最新学习(二):DDL语句
  19. [Mysql] SQL的书写顺序与执行顺序
  20. Python 去掉BOM

热门文章

  1. 构建入门Restful Web服务
  2. mongodb服务安装及部署配置
  3. 22.4. IP Address
  4. 五十一、【Bluetooth蓝牙模块】
  5. Ubuntu on Windows,在Windows上的Ubuntu
  6. ECSHOP商城网站建设之自定义调用广告方法(二)
  7. webstorm license key
  8. 移动硬盘(U盘)病毒对数据的破坏
  9. 用户ID生成唯一邀请码的几种方法
  10. eclipse springmvc+Thymeleaf