这一节我们将扩充上一节制作的支出报表的例子(所以继续使用第三个试验使用的例子),给他添加一个功能使管理者可以去管理大于1000的金额是通过审核还是拒绝。我们将使用一些新的活动包括 Listen, Delay等,另外还有一些定制的活动。 添加一个请求管理者通过的活动 1. 首先我们需要在类Workflow1声明ReportEmployeeId, ManagerEmployeeId 和 reviewArgs3个变量,所以给workflow1.xoml.cs添加如下代码: public string ReportEmployeeId = default(System.String); public string ManagerEmployeeId = default(System.String); public ExpenseLocalServices.ExpenseReportReviewedEventArgs reviewArgs = default(ExpenseLocalServices.ExpenseReportReviewedEventArgs); 2. 打开Workflow1.xoml的设计视图,选择EvaluateExpenseReport这个IfElse活动右边的活动分支(ElseRejected),修改其(Name)属性为ElseManagerApproval。删除里面我们在上一节中创建的活动rejectExpenseReport1。 3. 添加一个自定义活动GetManager(在我们上一节添加的自定义活动ExpenseActivities.dll中)到IfElse活动分支的ElseManagerApproval节点内,如图:
4. 设置getManager1的属性: ReportEmployeeId –点击[…]绑定到ReportEmployeeId 5. 修改Workflow1类中的ReportSubmitted_Invoked的代码,添加高亮的那行,将参数提供者提供的EmployeeId赋值给刚才我们声明的变量ReportEmployeeId。 6. Change the code in the ReportSubmitted_Invoked method to set the ReportEmployeeId to the value provided in the Expense Report’s EmployeeId property. Add the highlighted line of code below. private void expenseReportSubmitted1_Invoked(object sender, ExternalDataEventArgs e) { Console.WriteLine("ReportSubmitted_Invoked"); this.amount = this.reportArgs.Report.Amount; this.ReportEmployeeId = this.reportArgs.Report.EmployeeId; } 7. 在工作流设计视图中从工具箱拖拽一个活动CallExternalMethod到getManager1活动的下面。 8. 设置其(Name) 属性为 requestManagerApproval1 。 9. InterfaceType属性为ExpenseLocalServices.IExpenseService。 10. MethodName 属性从下拉列表框中选择 RequestManagerApproval 。 11. 还要设置如下属性: 12. ManagerEmployeeId – 设置为 ManagerEmployeeId. 13. Report – 设置为 reportArgs.Report. 14. 现在EvaluateExpenseReport 节点如下图所示:
添加一个Listen活动来等待支出报表的审核 1. 在requestManagerApproval1下添加一个Listen 活动。 2. 设置其(Name)属性为ListenForManagerApproval,修改其eventDrivenActivity1和eventDrivenActivity1的(Name)属性分别为:ManagerReviewed和ReviewTimeout。 3. 如图所示:
4. 在ManagerReviewed部分添加一个HandleExternalEvent活动,将这个新添加的活动(Name)属性设置为expenseReportReviewed1。 5. 继续给我们新创建的这个活动设置属性,将 a. InterfaceType 属性设置为ExpenseLocalServices.IExpenseService. b. EventName 属性设置为ExpenseReportReviewed c. 绑定属性e到reviewArgs。 6. 从工具箱中拖拽一个Delay活动到设计视图中Listen活动下的ReviewTimeout分支。 7. 设置这个新添加的活动delayActivity1的属性TimeoutDuration值为:00:00:30。 8. 现在的工作流如图所示:
批准或拒绝支出报表 1. 在expenseReportReviewed1活动下添加一个IfElse活动,修改(Name)属性为EvaluateReview。 2. 选择左边的分支,设置起属性: a. (Name) – 设置为 IfApproved b. Condition – 选择 CodeCondition,说明我们将通过代码控制条件。 c. 展开Condition属性,在下一级Condition中输入IfReportApproved_Condition,并双击,将在Workflow1类中自动添加此事件处理程序。 d. 我们输入入下代码,表示如果通过则将条件参数值设置为通过: public void IfReportApproved_Condition(object sender, ConditionalEventArgs e) { e.Result = this.reviewArgs.Review.Approved; } 3. 选择EvaluateReview活动右边的分支设置其(Name) 属性为ElseDeclined 4. 添加一个CallExternalMethod活动到EvaluateReview活动的IfApproved分支。 a. (Name) 属性设置为 approveExpenseReport2。 b. InterfaceType属性设置为ExpenseLocalServices.IExpenseService。 c. MethodName属性设置为ApproveExpenseReport。 d. report 属性设置为reportArgs.Report。 5. 同样的,添加一个CallExternalMethod活动到EvaluateReview活动的ElseDeclined分支。 a. (Name) 属性设置为 rejectExpenseReport1。 b. InterfaceType属性设置为ExpenseLocalServices.IExpenseService。 c. MethodName属性设置为RejectExpenseReport。 d. report 属性设置为reportArgs.Report。 6. 现在如图所示:
7. 在rejectExpenseReport1活动上右键点击复制,粘贴到delayActivity1活动下面并修改这个新创建活动的(Name) 属性为 rejectExpenseReport2. 8. 如图: 9. 10. 现在我们的工作流制作完成了,他的全图如下所示
测试报表支出工作流 1. Next you will verify that the startup application is correct. 2. 察看ExpenseWorkflows项目的属性,点击调试选项卡,象上一节一样,确认在启动操作中选择启动外部程序,并导航到ExpenseWorkflows/ExpenseWorkflows/bin/Debug/ExpenseHost.exe。 3. 下面点击F5启动调试。 4. 运行ExpenseWorkflows/ExpenseApplication/bin/Debug目录下的ExpenseApplication.exe 5. 运行ExpenseWorkflows/ManagerApplication/bin/Debug 目录下的ManagerApplication.exe 6. 如图 7. 现在,我们再在Expense Reporting 中提交一条数据: 8. 在Manager Expense Report Review中通过点击刷新获得此条数据: 9. 并且,通过点击通过还是拒绝来审核此条纪录是否通过。如果超时30秒,那么就会自动拒绝。 10. 最终提交的数据如下: 11. 12. 这里我们可以学到Listen和Delay的用法,更充实了第三个试验的内容。 |
跟我一起学Windows Workflow Foundation(4)
最新推荐文章于 2019-09-30 19:44:19 发布
跟我一起学Windows Workflow Foundation(4) 使用Listen,Delay,和其他envnt-based定制活动
2007年04月12日 10:56