惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
L
LINUX DO - 最新话题
Stack Overflow Blog
Stack Overflow Blog
月光博客
月光博客
雷峰网
雷峰网
Apple Machine Learning Research
Apple Machine Learning Research
V
Visual Studio Blog
Attack and Defense Labs
Attack and Defense Labs
O
OpenAI News
The GitHub Blog
The GitHub Blog
A
About on SuperTechFans
B
Blog RSS Feed
H
Help Net Security
量子位
小众软件
小众软件
SecWiki News
SecWiki News
N
Netflix TechBlog - Medium
TaoSecurity Blog
TaoSecurity Blog
美团技术团队
博客园 - 司徒正美
Hacker News - Newest:
Hacker News - Newest: "LLM"
Recent Commits to openclaw:main
Recent Commits to openclaw:main
The Cloudflare Blog
N
News and Events Feed by Topic
C
Cybersecurity and Infrastructure Security Agency CISA
The Last Watchdog
The Last Watchdog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Scott Helme
Scott Helme
T
The Exploit Database - CXSecurity.com
K
Kaspersky official blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Threat Research - Cisco Blogs
C
CERT Recently Published Vulnerability Notes
Application and Cybersecurity Blog
Application and Cybersecurity Blog
U
Unit 42
Google DeepMind News
Google DeepMind News
J
Java Code Geeks
Schneier on Security
Schneier on Security
G
Google Developers Blog
Forbes - Security
Forbes - Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
Y
Y Combinator Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Palo Alto Networks Blog
A
Arctic Wolf
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The Hacker News
The Hacker News
B
Blog
D
DataBreaches.Net
Simon Willison's Weblog
Simon Willison's Weblog

博客园 - zhangdong

软件架构和设计 在Visual Studio 2010中定义GDI+自定义控件——自定义控件介绍 Visual Studio 2010 Team System 动手实验室——架构师工具 Visual Studio 2010 Team System 动手实验室 Silverlight 框架 .NET Framework 3.5 Silverlight 的发展之路 Microsoft Exchange Server 2010 介绍 Silverlight 3 —— 介绍 搭建基于MOSS的团队解决方案01——Microsoft Office SharePoint 2007 Server快速入门(Continued) 搭建基于MOSS的团队解决方案01——Microsoft Office SharePoint 2007 Server快速入门 Windows Workflow Foundation 实验01 —— Windows Workflow Foundation 快速入门(练习三) Windows Workflow Foundation实验01——Windows Workflow Foundation 快速入门(练习二) Windows Workflow Foundation实验01——Windows Workflow Foundation快速入门(练习一) Windows Workflow Foundation实验——安装与准备 使用.NET平台工具操作Live Framework 地图控件快速入门——控制地图 地图控件快速入门 - zhangdong - 博客园 WCF中的管道——管道类型
Windows Workflow Foundation实验01——Windows Workflow Foundation快速入门(练习四)
zhangdong · 2010-01-13 · via 博客园 - zhangdong

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

在这个练习中你将会扩展在练习三中创建的报销审核工作流,来提供给管理者审核或者拒绝大于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