练习三 —— 使用If/Else活动,声明条件和自定义活动
在这个练习中,你会学习如何使用IF/Else活动并在工作流中声明条件来有条件的执行过程。而且你还会学习如何在工作流中使用自定义活动。这个练习中我们通过构建一个简单的顺序工作流来处理一个费用报销。当费用报销被提交时,工作流将会接收一个事件。这个事件的参数将会包含费用报销,如果消费的总额少于1000美元我们将会自动通过审核。然而,如果等于或者大于1000美元,该费用报销审核会不通过。
为了实现这个试验并把注意力集中在工作流的定义上,你需要一个自定义的费用报销活动,工作流宿主和Windows应用程序来提交一个费用报销到工作流。
因为这个试验中的某些部分是预定义好的,所以你必须确定使用项目名称为ExpenseWorkflows。否则该试验可能无法正常运行。
任务1 —— 创建一个工作流项目
- 在开始菜单|程序|Microsoft Visual Studio 2008|Microsoft Visual Studio 2008中打开Visual Studio 2008。
- 在Visual Studio 中选择文件|新建项目|菜单命令。
- Visual Studio将会显示新建项目对话框。
- 在新建项目对话框中,展开项目类型树中的Visual C#|Workflow节点。
- 选择模板名为空工作流项目的模板,输入如下值作为项目名: ExpenseWorkflows。
- 现在你会得到一个新的解决方案和工作流项目。我们需要添加一个新的顺序工作流到项目中。
- 选择项目|添加顺序工作流菜单。Visual Studio会显示添加新项对话框。
- 在添加新项对话框中,选择工作流模板为Sequential Workflow (with code seperation)的模板,并使用默认的工作流名为Workflow1.xoml。
- 两个新的文件名为Workflow1.xoml和Workflow1.xoml.cn的文件将会被添加到ExpenseWrokflows项目中。Workflow1.xoml包含XML工作流标签来显示工作流的定义。Workflow1.xoml.cs包含工作流的code-beside代码。
任务2 —— 添加费用报销接口到项目中
- 我们将会使用HandleExternalEvent和CallExternalMethod活动来与费用报销进行交互。在这之前,我们可以开始设计它们,我们还需要添加一个引用到依赖的程序集上。选择项目|添加引用菜单,为ExpenseWorkflows项目添加引用。
- 在添加引用对话框中选择浏览选项卡。
- 下载并浏览到ExpenseLocalServices.dll。(超链接可下载)
- 点击OK,关闭添加引用对话框。
任务3 —— 添加ExpenseReportSubmitted活动。
- 在Workflow1类中,我们需要创建两个成员变量。一个变量名为reportArgs。该变量会被用在ReportSubmitted事件参数中,用来承载报销对象。第二个变量会保存提交的报销的总数。随后我们将在工作流中使用这些变量。
- 右键单击Workflow1.xoml.cs并选择查看代码。添加如下代码:
1: public partial class Workflow1 : SequentialWorkflowActivity
2: {
3: public ExpenseLocalServices.ExpenseReportSubmittedEventArgs reportArgs =
4: default(ExpenseLocalServices.ExpenseReportSubmittedEventArgs);
5: public int amount = default(System.Int32);
6: }
- 在解决方案资源管理器中双击Workflow1.xoml,返回工作流设计界面。
- 在工作流设计界面上,选择视图|工具箱菜单,来显示包含可用活动的工具箱。
- 选择HandleExternalEvent活动,并拖拽它到工作流设计界面中。
- 设置其Name属性为expenseReportSubmitted1。
- 你的工作流现在应该如右图所示:
- 单击这个新活动的红色感叹号,在菜单中选择“Property’Interface’ is not set”。
- 单击接口类型属性,单击[…]按钮显示.NET类型浏览器对话框。从引用的程序集树中选择ExpenseLocalSerivces.IExpenseService。
- 单击OK关闭当前.NET类型浏览器对话框。
- 在expenseReportSubmitted1的属性窗口中,使用EventName的下拉列表,选择ExpenseReportSubmitted。
- 单击e属性,然后单击图标。就会出现如下界面:属性绑定界面。
- 选择reportArgs,点击OK。
- 对于Invoked属性,输入属性值:ReportSubmitted_Invoked并按下回车转到code-beside文件。
- 在ReportSubmitted_Invoked方法中添加代码来打印方法名到输出显示器。并且设置amount变量以使用事件中的数据。代码如下所示:
1: private void ReportSubmitted_Invoked(object sender, ExternalDataEventArgs e)
2: {
3: Console.WriteLine("ReportSubmitted_Invoked");
4: this.amount = this.reportArgs.Report.Amount;
5: }
任务4 —— 添加预定义的自动审批活动到工作流
- 我们将会添加一个预定义的自定义活动来计算提交的报销是否可以被自动通过审批。AutoApprove活动将会使用它自己的AutoApprovalPolicy活动帮我们实现这个功能。但首先我们需要添加它到工具箱,它才可以被用到我们的工作流中。
- 选择工具|选择工具项菜单。
- 选择.NET Framework组件选项卡并单击浏览按钮。
- 下载并定位到ExpenseActivities.dll。
- 在选择工具项对话框上点击OK。
- 在解决方案资源管理器中右键单击Workflow1.xoml文件,并选择查看设计视图以转向工作流设计视图。
- 在我们的工作流中会有两个新的可用活动。AutoApprove和GetManager。拖拽AutoApprove到你的工作流上放到expenseReportSubmitted1的下面。现在你的工作流应如下所示:
- 选中新建的autoApprove1活动。
- 在autoApprove1的Amount属性中,单击省略号以绑定属性到Workflow1.amount上。
任务4 —— 添加规则条件到工作流
一个规则条件是一个被会话框创建的,存储在工作流的XML中的条件状态。它可以包含用来比较的工作流状态和布尔值类型的多个比较状态的组合。
- 在解决方案资源管理器中右键点击Workflow1.xoml文件,选择查看设计视图菜单以转向工作流设计视图。
- 从工具箱中选择ifElse活动,并添加它到autoApprove1活动的下方。
- 选择新的ifElse活动并设置它的Name属性为EvaluateExpenseReport。
- 选择ifElse活动的左侧部分,标记为ifElseBranceActivity1。
- 在属性窗口中输入或选择如下属性的值。Name属性:输入ifAutoApproveReport。Condition属性:在下拉列表中选择声明规则条件。
- 在属性窗口中单击[+]展开条件属性,在ConditionName属性中输入AutoApproveCondition。
- 在规则条件编辑器上的省略号上单击,并输入Expression属性,如下所示:
- 在条件窗口中输入this.autoApprove1.Approved,点击OK。注意:如果你在Name属性旁边的省略号上点击,你会看到一个对话框。这个对话框允许你管理所有声明的条件。下次你再创建条件时,可以尝试使用这种方法。
- 在Visual Studio工作流设计器上,选择EvaluateExpenseReport活动右侧的标有ifElseBranchActivity2的部分。
- 在属性窗口中,选择Name属性,并修改为ElseRejected。
任务5 —— 添加逻辑以通过或拒绝报销审批
- 在工具箱中选择CallExternalMethod活动,并拖拽它到工作流设计器界面上,放到IfAutoApproveReport。
- 设置新活动的Name属性为approveExpenseReport1。
- 与任务3中的HandleExternalEvent活动相同,选择接口类型属性。选择接口类型旁边的[…],在打开的对话框中选择ExpenseLocalService.IExpenseService。
- 选择方法名属性,然后选择在下拉列表中选择ApproveExpenseReport。
- 同样在属性窗口中,输入或者选择如下属性的值。report:单击省略号绑定到reportArgs.Report,如下所示。
- 添加另一个CallExternalMethod活动到工作流中,放置在IfElse活动的ElseRejected一侧。
- 设置Name 属性为rejectExpenseReport1。
- 选择接口类型属性。然后选择ExpenseLocalService.IExpenseService.
- 选择方法名属性,在下拉列表中选择RejectExpenseReport。
- 选择Report属性,并绑定reportArgs.Report。
任务6 —— 配置ExpenseWorkflows项目并调试
- 下载并定位到如下文件ExpenseHost.exe和ExpenseHost.exe.config。
- 将上面两个文件拷贝到工作流程序集所在目录下。可以通过如下方法快速定位到工作流程序集所在根路径上。 放到当前根目录下的bin\debug文件夹中。
- 现在我们需要更改ExpenseWorkflows项目的启动程序,使它可以作为宿主程序。右键在ExpenseWorkflows项目上单击,并选择属性。
- 在项目属性窗口中,选择调试选项卡。
- 修改StartAction为已存在的程序,并且输入或浏览我们测试宿主程序的路径: C:\Users\Administrator\Documents\Visual Studio 2008\Projects\ExpenseWorkflows\ExpenseWorkflows\bin\Debug\ExpenseHost.exe。
- 按下CTRL-S以保存配置。
- 在解决方案中双击Workflow1.xoml文件,打开Visual Studio工作流设计器。
- 在工作流的起始位置,expenseReportSubmitted1活动中设置断点。
任务7 —— 测试报销审核工作流
- 通过按下F5,编译并运行ExpenseWorkflows项目。或者选择调试|开始调试。
- ExpenseHost将会启动并显示一个控制台窗口。它等待报销审批从ExpenseApplication中提交。
- 下载并运行ExpenseApplication.exe和ExpenseApplication.exe.config。
- 使用ExpenseApplication,单击提交报销按钮使用默认值来创建新的报销审核。
- Visual Studio会在断点活动——expenseReportSubmitted1活动处中断。
- 使用F11(或者调试|单步调试)然后你将会逐步骤地运行ReportSubmitted_Invoked事件处理程序。
- 使用F11(或者调试|单步调试)继续进行逐步调试代码。那么工作流会运行到rejectExpenseReport1活动。
- 现在按下F5(或调试|继续)来完成工作流实例的运行。
- 在报销审核应用程序,单击刷新按钮来查看刚刚个提交的1500美元报销审批的状态。 只有少于1000美元的报销才会被自动批准。
- 提交另一个500美元的报销审核,你将会再次使用断点调试。使用F5(或调试|继续)来完成工作流。注意报销审核被自动批准。
- 当工作流执行完成,你可以关闭报销审核应用程序。
- 停止ExpenseHost控制台应用程序。并停止调试工作流项目。