介绍如何使用 Windows Workflow Foundation 来处理自动进程与人工活动贯穿相交的这种常见业务方案。它为开发和执行基于复杂过程的多种应用程序提供了框架。典型示例包括文档治理应用程序、企业对企业应用程序和企业对消费者应用程序。用户可以使用 Visual Studio 2005 帮助设计基础工作流以及有关的顶级应用程序和程序集。
可以使用 Windows 窗体应用程序来收集电话的相关输入数据,并在数据库中创建一个记录:即包含时间、说明、状态和唯一 ID 的票证。第二个 Windows 窗体应用程序的用户将看到待处理申请的实时列表,然后选取一个申请。然后,接线员将尽量解决问题(回电给客户、检索申请的信息、发送电子邮件或执行一些远程活动),并指明问题是已解决还是需要进一步研究。此决策可由一个命令性操作表示,例如单击某个按钮更新同一基础数据库中的票证。最后,假如还涉及其他类别的用户,自定义前端将使这些用户能够指明问题已成功关闭或中止。
假如用户具备由各活动组成的基于工作流的系统(如 Windows Workflow Foundation),则可利用命令性代码和声明性活动地图的强大组合以及绑定它们的声明性规则来实现应用程序。主要好处在于用户可以为解决方案建模(甚至以直观方式建模),将 Windows Workflow 嵌入运行时服务器来解释图表,并使 Windows Workflow 遵循在创建块中定义的链接。进程越复杂,为其设计和实现的流程就越简单。进程动态更改越轻易,用户需要编写和维护的代码数量就越少。让我们了解一下如何实现技术支持方案的 Windows Workflow Foundation 解决方案。
技术支持解决方案
通过创建票证,创建的技术支持工作流程即开始,然后在等待连接用户或技术人员给予响应时停止。无论票证是关闭还是升级,工作流都将获得外部事件,并更新应用程序的内部状态以跟踪该事件。因此,工作流需要与外界进行交互。这类异步活动是 Windows Workflow Foundation 解决的实际工作流进程的固有问题之一。因为需要与系统外部的实体进行交互,所以宿主应用程序和工作流可以定义约定,以进行任何必要的数据交换。此处显示的 IHelpDeskService 接口说明了在工作流及其宿主之间建立的通信接口:
WorkflowPersistence 服务将序列化功能添加到在给定运行时引擎内执行的所有工作流实例。工作流服务核心功能由 WorkflowPersistenceService 类表示。Windows Workflow Foundation 通过 SqlWorkflowPersistenceService 实现它。此类可以将工作流数据保存到具有已知架构的 SQL Server 2000 或 SQL Server 2005 数据库中。用户可以使用许多脚本和基于对话框的实用程序轻松创建目标数据库。可以从 Windows Workflow Foundation 网站 下载所需内容。必须创建 SQLWorkflowPersistenceService 的实例并向运行时注册,才能实际启动运行时。持久性服务的构造函数使用连接字符串作为其唯一的参数。
如前所述,运行时服务是整体 Windows Workflow Foundation 体系结构的可插入部分,因此用户可以创建自己的服务,并使用自己的服务替换标准服务。 QQRead.com 推出数据恢复指南教程 数据恢复指南教程 数据恢复故障解析 常用数据恢复方案 硬盘数据恢复教程 数据保护方法 数据恢复软件 专业数据恢复服务指南 恢复工作流实例
在所述方案中,需要由其他接线员(技术人员)接手任何开放的票证,并尽可能去解决它们或将它们提交给上一级。技术人员将使用其他应用程序,或者至少使用图 4 中的应用程序的其他实例。在这两种情况下,都必须通过持久性支持创建工作流运行时的其他实例,并且必须加载和恢复正确的工作流状态。如您所见,只有在已经保存空闲工作流的 ID 的情况下才发生这种情况。在技术支持示例应用程序中,票证 ID 特意设置为与工作流 ID 相匹配,每个票证都对应于被创建用于处理票证的工作流的一个实例。
工作流完成时,将自动从 Windows Workflow Foundation 持久性数据库中删除。当工作流结束时,WorkflowCompleted 事件将激发。在技术支持方案中,工作流将在接线员单击解决或升级之后完成(请参阅图 6)。
从开发的角度而言,要害要注重以下两点。第一,要将事件引发到工作流,必须将申请发布到池线程:
public void RaiseCloseTicketEvent(Guid instanceId) { ThreadPool.QueueUserWorkItem(JustCloseTheTicket, new HelpDeskTicketEventArgs(instanceId, "Jim")); }
public void JustCloseTheTicket(object o) { HelpDeskTicketEventArgs args = o as HelpDeskTicketEventArgs; if (TicketClosed != null) TicketClosed(null, args); } 第二,不能在主 Windows 窗体线程上引发 WorkflowCompleted 事件,因此不能直接更新任何 UI 控件。(这是由于 Windows 窗体控件不是线程安全控件。)确实可以在创建 Windows 窗体控件的线程之外的线程中更新 Windows 窗体控件,但是需要间接调用更新控件的方法:
Windows Workflow Foundation 使用户可以直观地设计复杂的算法,从而解决业务问题并为进程建模。工作流是用于说明数据和操作流的工具。因此,任何需要 IF 或 WHILE 语句的方案都可以是工作流。但是,任何人都不能使用仅包含 IF 语句的工作流,工作流运行时确实具有成本,该成本可以在流复杂性超出给定阈值时分摊。
基于工作流的解决方案的真正优点是使复杂进程更易于建模和实现,更重要的是使其更易于改进和扩展。Windows Workflow Foundation 为 Windows Workflow 程序提供了托管执行环境,还为程序提供了持续时间、可靠性、挂起/恢复以及补偿特征。在某种意义上,活动类似于中间语言 (IL) 操作码或程序语句,但包含特定领域的知识。简而言之,Windows Workflow Foundation 使程序语义具有声明性并且十分准确,使用户能够为接近实际进程的应用程序建模。它是最适合此工作的工具。用户无需使用 IL 编写前端可视应用程序,而是使用 RAD 开发工具和更具人类可读性的语言。Windows Workflow Foundation SDK 提供了广泛的编程语言,专门用于为复杂的业务程序建模,非凡是在这些程序可能随着时间而改进的情况下。在这种情况下,主要好处在于用户可以添加非凡活动来进行工作流,并使用内置行为活动来控制该工作流。用户可以专注于任务,其他事情由运行时进行处理。