在 2006 年 1 月号中,Don Box 和 Dharma Shukla 介绍了 Windows Workflow Foundation,并讨论了框架的整体体系结构及其构成组件(请参阅 WinFX Workflow:Simplify Development With The Declarative Model Of Windows Workflow Foundation [英文])。这篇文章促使我想进一步讨论这个主题,并介绍如何使用 Windows Workflow Foundation 来处理自动进程与人工活动贯穿相交的这种常见业务方案。它为开发和执行基于复杂过程的多种应用程序提供了框架。典型示例包括文档管理应用程序、企业对企业应用程序和企业对消费者应用程序。用户可以使用 Visual Studio 2005 帮助设计基础工作流以及有关的顶级应用程序和程序集。
常见业务方案
对于订单处理、采购申请、差旅费用之类的任务,各组织通常会设有许多内部进程。工作流使这些独立进程以透明、动态、有效的方式按顺序进行。
让我们看一个典型的技术支持工作流进程。在技术支持人员接到客户电话,并开立记录客户姓名、来电时间和问题简要说明的票证时,进程即算开始。创建票证之后,该技术支持人员会将这件事放在一边,并等待其他来电。下班时,他将注销计算机,然后回家。此时,在另一个部门中(可能位于其他城市),一组技术人员正专注解决这些未解决的问题。每个工作的技术人员要选取申请,然后解决该申请或将该申请升级到第二级帮助。如何编写代码来实现此进程?
可以使用 Windows 窗体应用程序来收集电话的相关输入数据,并在数据库中创建一个记录:即包含时间、说明、状态和唯一 ID 的票证。第二个 Windows 窗体应用程序的用户将看到待处理申请的实时列表,然后选取一个申请。然后,接线员将尽量解决问题(回电给客户、检索申请的信息、发送电子邮件或执行一些远程活动),并指明问题是已解决还是需要进一步研究。此决策可由一个命令性操作表示,例如单击某个按钮更新同一基础数据库中的票证。最后,如果还涉及其他类别的用户,自定义前端将使这些用户能够指明问题已成功关闭或中止。
尽管此过程明确地表达了工作流需要用户进行某些决策,但可以使用以标准编程语言和数据库编写的传统顺序代码轻松实现。
应用 Windows Workflow Foundation
如果用户具备由各活动组成的基于工作流的系统(如 Windows Workflow Foundation),则可利用命令性代码和声明性活动地图的强大组合以及绑定它们的声明性规则来实现应用程序。主要好处在于用户可以为解决方案建模(甚至以直观方式建模),将 Windows Workflow 嵌入运行时服务器来解释图表,并使 Windows Workflow 遵循在创建块中定义的链接。进程越复杂,为其设计和实现的流程就越简单。进程动态更改越容易,用户需要编写和维护的代码数量就越少。让我们了解一下如何实现技术支持方案的 Windows Workflow Foundation 解决方案。
技术支持解决方案
通过创建票证,创建的技术支持工作流程即开始,然后在等待连接用户或技术人员给予响应时停止。无论票证是关闭还是升级,工作流都将获得外部事件,并更新应用程序的内部状态以跟踪该事件。因此,工作流需要与外界进行交互。这类异步活动是 Windows Workflow Foundation 解决的实际工作流进程的固有问题之一。因为需要与系统外部的实体进行交互,所以宿主应用程序和工作流可以定义约定,以进行任何必要的数据交换。此处显示的 IHelpDeskService 接口说明了在工作流及其宿主之间建立的通信接口:
[DataExchangeService]
public interface IHelpDeskService
{
event EventHandler<HelpDeskTicketEventArgs> TicketClosed;
event EventHandler<HelpDeskTicketEventArgs> TicketEscalated;
void CreateTicket(
string description, string userRef, string createdBy);
void CloseTicket(string ticketID);
void EscalateTicket(string ticketID);
}