使用监听、延迟和基于事件的自定义活动
在这个练习中你将会扩展在练习三中创建的报销审核工作流,来提供给管理者审核或者拒绝大于1000美元的报销申请的管理功能。你将会熟悉一些额外的活动,如监听、延迟和一些额外的自定义活动。
任务1 —— 添加活动来请求管理者审核
- 在解决方案资源管理器中右键单击workflow1.xoml.cs,选择代码视图。
- 在Workflow1类的开始处为ReportEmployeeId、ManagerEmployeeId和reviewArgs添加声明。
public string ReportEmployeeId = default(System.String); public string ManagerEmployeeId = default(System.String); public ExpenseLocalServices.ExpenseReportReviewedEventArgs reviewArgs = default(ExpenseLocalServices.ExpenseReportReviewedEventArgs);
- 在Visual Studio 2008中,右键在解决方案资源浏览器中单击Workflow1.xoml文件并选择设计视图,以Visual Studio工作流设计界面打开Workflow1.xoml文件。
- 右键单击rejectExpenseReport1活动,然后选择删除。
- 选择右侧的EvaluateExpenseReport ifElse活动(现在叫ElseRegected),然后在属性窗口中将Name属性修改为ElseManagerApproval.
- 从工具箱中拖拽一个GetManager(在练习三中,随着我们添加ExpenseActivities.dll,同时添加到工具箱中的)活动到工作流定义中IfElse的ElseManagerApproval一侧。
- 在属性窗口中输入或选择如下属性的值:a. ManagerEmployeeId —— 单击加号将它绑定到ManagerEmployeeId上;b. ReportEmployeeId —— 单击加号将它绑定到ReportEmployeeId。
- 修改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; }
- 在解决方案资源管理器中双击Workflow1.xoml文件以返回Visual Studio工作流设计器。
- 从工具箱中拖拽一个CallExternalMethod活动添加到工作流中的getManager1活动的下方。
- 设置CallExternalMethod活动的Name属性为requestManagerApproval1。
- 首先选择InterfaceType属性,选择ExpenseLocalServices.IExpenseService。
- 选择方法名然后在下拉列表中选择RequestManagerApproval。
- 然后,再属性窗口中为如下属性输入或选择如下值:a. ManagerEmployeeId——单击加号将其绑定到ManagerEmployeId;b. Report —— 单击加号将其绑定到reprotArgs.Report。
- 现在EvaluateExpenseReport应该如下所示:
任务2 —— 添加一个监听活动来等待报销审批的检查
- 从工具箱中拖拽一个Listen活动到工作流设计器中,放置在requestManagerApproval1活动的下方。
- 在属性窗口中,修改listenActivity1活动的Name属性值为ListenForManagerApproval。a. 修改Listen活动的eventDrivenActivity1节的Name属性为ManagerReviewed;b. 修改Listen活动的eventDrivenActivity2节的Name属性为ReviewTimeout。
- 我们正在编辑的工作流定义部分应如下所示:
- 从工具箱中拖拽并添加一个HandleExternalEvent活动到工作流设计器的ManagerReviewed节中。
- 设置HandleExternalEvent活动的Name属性为expenseReportReviewed1.
- 保持这个新的expenseReportReviewed1选中,转向属性窗口。
- 修改InterfaceType属性,选择ExpenseLocalServices.IExpenseService。
- 修改EventName属性,然后从下拉列表中选择ExpenseReportReviewed。
- 然后,再属性窗口中输入或选择如下属性的值:a. e——单击加号绑定这个属性到reviewArgs。
- 你的工作流定义现在应如下所示:
- 从工具箱中拖拽Delay活动到工作流设计界面,放置Listen活动的ReviewTimeout一侧。
- 保持delayActivity1活动选中,转向属性窗口并设置TimeoutDuration属性为00:00:30。
- 你的工作流定义应该如下图所示:
任务3 —— 审批或拒绝报销申请
- 添加一个ifElse活动到工作流定义中expenseReportReviewed1活动的下方。
- 在属性窗口中,修改ifElseActivity1活动的Name属性为EvaluateReview。
- 选择EvaluteReview IfElse活动的左侧。
- 在属性窗口中输入或选择下列属性的值:a. Name —— 输入IfApproved;b. Condition —— 在下拉列表中选择CodeCondition,来表示该条件是一个基于代码的条件。
- 在属性窗口中展开Condition属性及其子Condition属性,输入IfReportApproved_Condition。你的属性对话框应该如下所示:当你点击回车,条件代码将会被添加并显示在代码窗口中。
- 在IfReportAproved_Condition事件处理程序中,设置ConditionalEventArgs.Result属性为Bool值,而这个Bool值存储在reviewArgs.Review对象的Approved属性中:
public void IfReportApproved_Condition(object sender, ConditionalEventArgs e) { e.Result = this.reviewArgs.Review.Approved; }
- 现在在解决方案资源管理器中双击Workflow1.xoml,转向Visual Studio工作流设计视图。
- 选择EvaluateReview IfElse活动的右侧,然后在属性窗口中将Name属性修改为ElseDeclined。
- 你的工作流定义应该如下图所示:
- 添加一个CallExternalMethod活动到工作流定义的IfElse活动中IfApproved一侧。
- 设置CallExternalMethod活动的Name属性为approveExpenseReport2。在工作流中已经有一个approveExpenseReport1存在了。
- 选择Interface类型属性,选择ExpenseLocalServices.IExpenseService。
- 选择MethodName属性,然后在下拉列表中选择ApproveExpenseReport。
- 选择report属性,然后双击加号将其绑定到reportArgs.Report。
- 你的工作流定义应如下所示:
- 添加一个CallExternalMethod活动到工作流定义的IfElse中的ElseDeclined一侧。
- 设置CallExternalMethod活动的Name属性为rejectExpenseReport1。
- 选择InterfaceType属性,选择ExpenseLocalServices.IExpenseService。
- 选择MethodName属性,然后在下拉列表选择RejectExpenseReport。
- 选择report属性,然后单击加号并绑定它到reportArgs.Report。
- 你的工作流应该定义如下:
- 右键单击rejectExpenseReport1活动,在菜单中选择Copy。
- 右键单击Visual Studio工作流设计器中delayActivity1活动的下方,选择粘贴。
- 设置这个粘贴的活动的Name属性为rejectExpenseReport2.
- 你的工作流应该如下所示:
- 你的报销审批工作流现在完成了。完整的工作流应该如下所示:
任务4 —— 测试报销审批工作流
- 接下来,你将验证启动应用程序的正确性。
- 定位到项目|报销审批工作流属性菜单。
- 单击调试选项卡。
- 确定选中的是启动外部应用程序选项,且程序列表中出现如练习三中所示的ExpenseHost.exe地址。
- 在解决方案中双击Workflow1.xoml文件转向visual Studio 工作流设计器。
- 在工作流开始处的expenseReportSubmitted1活动上设置断点。工作流的顶端如图所示:
- 编译并运行ExpenseWorkflows项目。
- ExpenseHost将会启动,并显示一个控制窗口。
- 按照练习三中的路径,运行ExpenseApplication.exe。
- 下载并运行ManagerApplication.exe。
- 使用报销应用程序,单击提交申请按钮以创建一个新的报销申请并提交到工作流。一个新的工作流实例启动,Visual Studio 2008将会以调试模式中断在expenseReportSubmitted1活动处。
- 你可以按F5继续调试。到审查过期有30秒的延迟。
- 现在删除所有的端点,再按F5继续执行。
- 现在你可以提交多个不同值的报销审批。
- 使用Manager应用程序,单击刷新按钮来刷新报销申请列表。
- 从列表中选择一个报销申请,单击同意按钮以通过审核。
- 最后,使用Expense Reporting应用程序,单击刷新按钮来刷新状态的更改。记住,如果你在提交报销申请后等待超过30秒,工作流将会自动拒绝。因为我们添加的延迟活动已经配置好了。