使用监听、延迟和基于事件的自定义活动

在这个练习中你将会扩展在练习三中创建的报销审核工作流,来提供给管理者审核或者拒绝大于1000美元的报销申请的管理功能。你将会熟悉一些额外的活动,如监听、延迟和一些额外的自定义活动。

任务1 —— 添加活动来请求管理者审核

  1. 在解决方案资源管理器中右键单击workflow1.xoml.cs,选择代码视图。
  2. 在Workflow1类的开始处为ReportEmployeeId、ManagerEmployeeId和reviewArgs添加声明。
    public string ReportEmployeeId = default(System.String);
    public string ManagerEmployeeId = default(System.String);
    public ExpenseLocalServices.ExpenseReportReviewedEventArgs reviewArgs =
            default(ExpenseLocalServices.ExpenseReportReviewedEventArgs);
  3. 在Visual Studio 2008中,右键在解决方案资源浏览器中单击Workflow1.xoml文件并选择设计视图,以Visual Studio工作流设计界面打开Workflow1.xoml文件。
  4. 右键单击rejectExpenseReport1活动,然后选择删除。
  5. 选择右侧的EvaluateExpenseReport ifElse活动(现在叫ElseRegected),然后在属性窗口中将Name属性修改为ElseManagerApproval.
  6. 从工具箱中拖拽一个GetManager(在练习三中,随着我们添加ExpenseActivities.dll,同时添加到工具箱中的)活动到工作流定义中IfElse的ElseManagerApproval一侧。clip_image002_thumb1
  7. 在属性窗口中输入或选择如下属性的值:a. ManagerEmployeeId —— 单击加号将它绑定到ManagerEmployeeId上;b. ReportEmployeeId —— 单击加号将它绑定到ReportEmployeeId。
  8. 修改ReportSubmitted_Invoked方法中的代码来设置ReportEmployeeId为在报销申请的EmployeeId属性中提供的值。添加如下代码到该方法。
    public void ReportSubmitted_Invoked(object sender, EventArgs e)
    {
    	Console.WriteLine("ReportSubmitted_AfterInvoke");
    
    	this.amount = this.reportArgs.Report.Amount;
    
    	this.ReportEmployeeId = this.reportArgs.Report.EmployeeId;
    }
  9. 在解决方案资源管理器中双击Workflow1.xoml文件以返回Visual Studio工作流设计器。
  10. 从工具箱中拖拽一个CallExternalMethod活动添加到工作流中的getManager1活动的下方。
  11. 设置CallExternalMethod活动的Name属性为requestManagerApproval1。
  12. 首先选择InterfaceType属性,选择ExpenseLocalServices.IExpenseService。
  13. 选择方法名然后在下拉列表中选择RequestManagerApproval。
  14. 然后,再属性窗口中为如下属性输入或选择如下值:a. ManagerEmployeeId——单击加号将其绑定到ManagerEmployeId;b. Report —— 单击加号将其绑定到reprotArgs.Report。
  15. 现在EvaluateExpenseReport应该如下所示:clip_image0025_thumb1[1]

任务2 —— 添加一个监听活动来等待报销审批的检查

  1. 从工具箱中拖拽一个Listen活动到工作流设计器中,放置在requestManagerApproval1活动的下方。
  2. 在属性窗口中,修改listenActivity1活动的Name属性值为ListenForManagerApproval。a. 修改Listen活动的eventDrivenActivity1节的Name属性为ManagerReviewed;b. 修改Listen活动的eventDrivenActivity2节的Name属性为ReviewTimeout。
  3. 我们正在编辑的工作流定义部分应如下所示:clip_image0027_thumb1[1]
  4. 从工具箱中拖拽并添加一个HandleExternalEvent活动到工作流设计器的ManagerReviewed节中。
  5. 设置HandleExternalEvent活动的Name属性为expenseReportReviewed1.
  6. 保持这个新的expenseReportReviewed1选中,转向属性窗口。
  7. 修改InterfaceType属性,选择ExpenseLocalServices.IExpenseService。
  8. 修改EventName属性,然后从下拉列表中选择ExpenseReportReviewed。
  9. 然后,再属性窗口中输入或选择如下属性的值:a. e——单击加号绑定这个属性到reviewArgs。
  10. 你的工作流定义现在应如下所示:clip_image0029_thumb1[1]
  11. 从工具箱中拖拽Delay活动到工作流设计界面,放置Listen活动的ReviewTimeout一侧。
  12. 保持delayActivity1活动选中,转向属性窗口并设置TimeoutDuration属性为00:00:30。
  13. 你的工作流定义应该如下图所示:clip_image00211_thumb1[1]

任务3 —— 审批或拒绝报销申请

  1. 添加一个ifElse活动到工作流定义中expenseReportReviewed1活动的下方。
  2. 在属性窗口中,修改ifElseActivity1活动的Name属性为EvaluateReview。
  3. 选择EvaluteReview IfElse活动的左侧。
  4. 在属性窗口中输入或选择下列属性的值:a. Name —— 输入IfApproved;b. Condition —— 在下拉列表中选择CodeCondition,来表示该条件是一个基于代码的条件。
  5. 在属性窗口中展开Condition属性及其子Condition属性,输入IfReportApproved_Condition。你的属性对话框应该如下所示:clip_image00213_thumb1当你点击回车,条件代码将会被添加并显示在代码窗口中。
  6. 在IfReportAproved_Condition事件处理程序中,设置ConditionalEventArgs.Result属性为Bool值,而这个Bool值存储在reviewArgs.Review对象的Approved属性中:
    public void IfReportApproved_Condition(object sender, ConditionalEventArgs e)
    {
    	e.Result = this.reviewArgs.Review.Approved;
    }
  7. 现在在解决方案资源管理器中双击Workflow1.xoml,转向Visual Studio工作流设计视图。
  8. 选择EvaluateReview IfElse活动的右侧,然后在属性窗口中将Name属性修改为ElseDeclined。
  9. 你的工作流定义应该如下图所示:clip_image00215_thumb1
  10. 添加一个CallExternalMethod活动到工作流定义的IfElse活动中IfApproved一侧。
  11. 设置CallExternalMethod活动的Name属性为approveExpenseReport2。在工作流中已经有一个approveExpenseReport1存在了。
  12. 选择Interface类型属性,选择ExpenseLocalServices.IExpenseService。
  13. 选择MethodName属性,然后在下拉列表中选择ApproveExpenseReport。
  14. 选择report属性,然后双击加号将其绑定到reportArgs.Report。
  15. 你的工作流定义应如下所示:clip_image00217_thumb1
  16. 添加一个CallExternalMethod活动到工作流定义的IfElse中的ElseDeclined一侧。
  17. 设置CallExternalMethod活动的Name属性为rejectExpenseReport1。
  18. 选择InterfaceType属性,选择ExpenseLocalServices.IExpenseService。
  19. 选择MethodName属性,然后在下拉列表选择RejectExpenseReport。
  20. 选择report属性,然后单击加号并绑定它到reportArgs.Report。
  21. 你的工作流应该定义如下:clip_image00219_thumb2
  22. 右键单击rejectExpenseReport1活动,在菜单中选择Copy。clip_image00221_thumb1
  23. 右键单击Visual Studio工作流设计器中delayActivity1活动的下方,选择粘贴。
  24. 设置这个粘贴的活动的Name属性为rejectExpenseReport2.
  25. 你的工作流应该如下所示:clip_image00223_thumb1
  26. 你的报销审批工作流现在完成了。完整的工作流应该如下所示:clip_image00225_thumb1

任务4 —— 测试报销审批工作流

  1. 接下来,你将验证启动应用程序的正确性。
  2. 定位到项目|报销审批工作流属性菜单。
  3. 单击调试选项卡。
  4. 确定选中的是启动外部应用程序选项,且程序列表中出现如练习三中所示的ExpenseHost.exe地址。
  5. 在解决方案中双击Workflow1.xoml文件转向visual Studio 工作流设计器。
  6. 在工作流开始处的expenseReportSubmitted1活动上设置断点。工作流的顶端如图所示:clip_image0021_thumb1
  7. 编译并运行ExpenseWorkflows项目。
  8. ExpenseHost将会启动,并显示一个控制窗口。
  9. 按照练习三中的路径,运行ExpenseApplication.exe。
  10. 下载并运行ManagerApplication.execlip_image0023_thumb2
  11. 使用报销应用程序,单击提交申请按钮以创建一个新的报销申请并提交到工作流。一个新的工作流实例启动,Visual Studio 2008将会以调试模式中断在expenseReportSubmitted1活动处。clip_image0025_thumb1
  12. 你可以按F5继续调试。到审查过期有30秒的延迟。
  13. 现在删除所有的端点,再按F5继续执行。
  14. 现在你可以提交多个不同值的报销审批。clip_image0027_thumb1
  15. 使用Manager应用程序,单击刷新按钮来刷新报销申请列表。
  16. 从列表中选择一个报销申请,单击同意按钮以通过审核。clip_image0029_thumb1
  17. 最后,使用Expense Reporting应用程序,单击刷新按钮来刷新状态的更改。记住,如果你在提交报销申请后等待超过30秒,工作流将会自动拒绝。因为我们添加的延迟活动已经配置好了。clip_image00211_thumb1
posted on 2010-01-13 14:42  zhangdong  阅读(445)  评论(0编辑  收藏  举报