书讯 -- Microsoft Windows Workflow Foundation Step by Step

来源:互联网 发布:linux系统下安装软件 编辑:程序博客网 时间:2024/03/29 21:55

以图型呈现工作流程模型,并提供基础环境给开发者

当我们在设计与撰写应用程序时,多多少少会有条件、步骤、状态、事件、时程、进度。若这些组合简单易懂,则直接写在程序内即可,开发与维护都不成问题。但若组合复杂,执行时程跨日甚至跨月,则可能需要简单的工作流程引擎(Workflow Engine),透过明确与程序代码区块对应的图形来萃取工作流程模型(model),这将可简化设计、开发与维护,但又不需要花大钱购买如微软 BizTalk 等服务器。

微软在推出 Vista 操作系统后,同时推出了 .NET Framework 3.0,也就是在既有的 .NET Framework 2.0 之上,新增了四大块功能:

l   定义用户图形接口的 WPF(Windows Presentation Foundation)

l   程序间标准沟通方式 WCF(Windows Communication Foundation)

l   设计与撰写工作流程逻辑的 WF(Windows Workflow Foundation[1])

l   认证个人身分用的 WCS(Windows CardSpace)

换句话说,未来新的操作系统,都将内附 WF,而其他较早版本的操作系统,如 Windows XP Windows 2003 可以单独下载安装。也就是我们将有一个免费的工作流程执行环境(Workflow runtime)

WF 处在撰写程序的阶层,主要提供开发者将工作流程的功能内建到自己的应用程序中,是单一程序内的工作流程。其包含了工作流程架构(Framework).NET API、延伸的服务,以及 Visual Studio 2005 的可视化设计开发接口,但并非独立执行的服务或引擎。藉其 API 和工具,你我可以在 Windows 平台上开发含有工作流程的系统,并延伸 WF 既有的架构,客制化所需的功能。期待透过统一的模型与程序接口,解决多种工作流程的问题,包括人与人、人与系统和系统与系统之间的工作流程。

使用 WF 开发工作流程的经验与透过 .NET 程序代码开发其他组件近似,如同设计 Web/Windows窗体或控件,你可以图形接口设计大体架构,继而切换到程序代码页撰写触发事件,最后编译成 .NET 组件(Assembly)[2]。一般你还需要撰写承载工作流程的可执行程序(host,通常是个 exe),参照 WF 架构提供的组件,藉以加载工作流程执行环境,而后交付工作流程定义令其执行。

 

结合 Visual Studio 开发工作流程

一般而言,工作流程大分两类:

l   循序工作流程:工作流程的工作可以自动执行,不需要外界介入,例如不需与使用者互动,或等待事件触发。

l   以状态为基础的工作流程(state-based workflow):也有人称为有限状态机(finite state machine),其工作流程特征在与外界互动后改变状态,转换到下一个状态以进入工作流程下一步。

WF 据此提供两种主要的设计模板,搭配工作流程引擎提供了许多标准活动(Activity),如 IfElseWhileCodeDelaySequenceParallelTransactionScopeCompensatableTransactionScopeStateStateInitializationEventDrivenSetState…等。一般的作法是:它们以图形呈现在 Visual Studio 的工具栏上,让你拖曳到设计区中,以规划工作流程逻辑,再经由属性窗口设定事件对应的函数,进一步到程序代码页撰写 .NET 程序语言。

换句话说,WF 的「工作流程」是以「活动」示意图来定义的人或系统之行为模型。「活动」是「工作流程」中的各个步骤,并且是设定、执行和重用的单位,经由活动组合的设计图表达了规则、操作、状态以及彼此的关系。最后编译为 .NET 程序组件,且在工作流程执行环境和共通语言执行环境(CLR)中执行。如此,藉由 WF 可以设计使用者或服务器端的工作流程,在所有类型的 .NET 应用程序内执行。

这让程序设计人员可将个别程序的工作流程行为,从巨量的程序代码中单独萃取出来。在 Visual Studio 内,透过图形化的模型,较容易开发与维护这些工作流程。藉由专业的工作流程执行环境与设计模式,可提升所撰写程序的稳定性。但对于繁杂的工作流程,如公文签核或制造业所用的 RosettaNet…等等,可能还是需要独立的产品。

在大型应用系统上,我们需要弹性整合与控管,结合其它应用程序与多个平台,则仍需 A to A(Application to Application)B to B(Business to Business)EAI(Enterprise Application Integration)BPM(Business Process Management)等相关产品。毕竟,你可以徒手开发符合特殊目的之系统,但要整合多个系统、交换各种数据,融贯不同技术的存取接口等,本身就是件麻烦事。此时,建立商业工作流程的标准与弹性是重要的目的,耗时费工用低阶的 WF[3] 自己建车轮,反而会见树不见林。

总而言之,我们可以 WCF 建立程序间沟通的标准与易整合的服务,藉由 WF 建置服务内与服务间的工作流程,以 BizTalk 建立程序间有效快速的整合,以 BPM 产品弹性地串起企业内与企业间各个商务流程。

在此介绍一本不错的 WF 入门书:「Microsoft Windows Workflow Foundation Step by Step,作者是 Kenn Scribner,拥有多年的程序开发与顾问经验。他详细解释了工作流程引擎需要注意的问题,透过 WF 撰写自己的工作流程逻辑并不容易,因为可能要考虑多个相同工作流程定义但不同的实例一起执行,这时数据交换将需透过特定的界面与服务架构。此外,多线程的协同、时程控管、工作流程实例的追踪监控、将执行一半的工作流程存放到数据库内、交易管理、与外部应用程序沟通等等,都是需要关心的课题。

 

书籍内容

本书共分十九章,充满了 WF 的技术与流程设计的观念,作者同时说明 What How,相当不错。书籍规画上分为四个主要部分。简单介绍如下:

l   第一部分一至六章为 WF 的基础知识。第一章一开始便以逐步导引的方式,简单完成一个工作流程,并撰写 Host 程序,以乘载工作流程引擎与工作流程实例。第二章阐述了流程执行环境的设计架构,如何透过 .NET 程序语言参照与呼叫该环境所提供的对象、属性、方法与事件等。作者撰写了一个 WorkflowFactory 类别,据以整合工作流程执行环境,建立流程实例。并透过程序解说,列举执行流程应注意的事项,之后的章节将重复使用这个类别。第三章介绍工作流程实例的生与死,透过 WorkflowInstance 对象的属性和方法,以启动、查询与终止流程。在第四章中,大致区分流程的特征,描述循序流程和状态机流程的差异。第五章介绍如何追踪流程的执行,WF 默认提供将流程实例的执行纪录存放至 SQL Server,本章示范从 SQL Server 撷取这些数据并加以呈现,以及如何执行 Windows SDK 所附的小工具程序 WorkflowMonitor,简单呈现某个流程的执行状态。本章尚有另外一个重点,就是介绍 WF 架构预设提供的外加服务(pluggable service),在其后的多个章节中,多有用到此功能。第六章说明如何将长时间执行的流程实例;在其不活动(idle)的期间存放(Persist) SQL Server,以节省服务器的资源,以及如何再取出重新执行。

l   第二部分七至十三章逐章介绍各种活动,让你了解这些流程积木的特征,在堆砌时,才不致误用。第七章介绍了开发工作流程中基本的活动,如 SequenceCode…等,以及很重要的一些议题,如错误处理、除错、暂停与停止工作流程等。第八章解释如何在流程内将数据传给外部的 Host,这命题看似简单,实则相当麻烦。本章尚有另一个重点,如何在流程实例内执行另外一个子流程。第九章条列 WF 提供的逻辑控管活动,如 IfElseWhileReplicator 等活动,它们代表了撰写程序时的 if 判断式、whilefor 循环等。第十章介绍事件处理,本章提供之仿真买卖股票的范例蛮复杂的,统合了前面章节的各种技术,透过 Windows Form 型态撰写的 Host 程序买卖股票,Host 程序负责与用户互动,但买卖股票的商业逻辑写在工作流程。Host 须将买卖动作以事件的方式去触发已执行之流程。同时,流程也取得股票更新的数据,传给外部 Host 程序,以呈现股价的变化。第十一章介绍不同的活动平行执行,透过 Parallel 活动,可以在其内放置多个 Sequence 活动,而后再在 Sequence 内放置所需执行的其他活动。但由于 WS Parallel 活动内并非真的采用多线程并行执行,而是交错轮流执行,造成在第一个循序流程中执行了某个活动,接着就跳到第二个循序流程执行另一个活动。作者在此引进 SynchronizationScope 活动,以强制需要一起执行完毕的活动执行完后,才可以跳至另一个循序流程。第十二章解释如何透过设定规则(rule)与政策(policy),就可以改变流程的执行方式,而不需要以程序代码的 ifswitch 等语法写死在程序中,条件的逻辑改变还需要重新改写,这将提供更多的弹性。第十三章则是说明如何自行开发活动,作者从开启一个空的类别库(Class Library)开始,撰写继承 System.Workflow.ComponentModel.Activity 类别的子类别,用以完成自制的 FTP 活动。

l   第三部分十四至十六章介绍较为复杂的工作流程,第十四章以自动贩卖机为例子,解释以「状态」为基础的工作流程。贩卖机从等待到使用者投币、接着进入到钱数足够等待选择产品,以及完成等四个状态。作者示范如何透过事件转化状态,以完成有限状态的自动机器。第十五章说明如何在工作流程设计交易管理,本章续以状态为基础的工作流程仿真提款机,解释 TransactionScope CompensatableTransactionScope 活动的用途。第十六章解释如何用 XAML(XML Application Markup Language)描述流程主要架构,这个概念与 WPF 近似。本书的前十五个章节都是用 Visual Studio 的图形接口拖曳流程的活动,完成工作流程的主体架构。而这些活动其实都可以 XML 描述,你可以用任何文书编辑器编辑,再将其文本文件的扩展名定为 xoml,而细节的商业逻辑可以透过 .NET 程序语言撰写在 code-beside 档案中。

l   第四部分十七至十九章说明工作流程如何存取外部资源。第十七章介绍当一个 Host 程序要产生相同工作流程的多个实例,且需要交换数据时,需要注意的事项。最后两章分别是从工作流程呼叫 Web Service,以及让设计好的工作流程可以当作 Web Service 来使用。由于 WF 的流程默认是以异步执行,对长时间执行的流程来说,这是必要的。但 Web 网页呼叫的模式,是立刻返回并结束,这将无法处理在网页中被叫起的流程实例。由于在 IIS/ASP.NET 环境执行 WF 与之前章节的作法大不相同,因此若要将流程当作 Web Service,必须仔细研读第十九章。

最后,作者提供相当多有趣的范例散布在各章节中,与现实生活经验贴近,例如水箱、自动贩卖机、提款机、问卷、买卖股票等,让你容易领悟工作流程的特征,而实作练习也有相当的乐趣。

 

阅读建议

微软图书的 Step by Step 系列比较强调简单易懂,英文语法平铺直叙,各操作步骤尽量解释清楚。本书对WF 来说,是由浅而深的入门书,但不适合程序设计新手,你需要熟悉 C#,知道多线程、平行运算、交易管理、状态机(State machine)FtpWebRequest 类别、MS SQL Server 数据库、ASP.NETWeb Service…等概念,换言之,你是个程序老手,而 WF 将是另一个工作利器。

作者在整本书各章节中,都提供了范例。每个范例大都有基本的初始环境,以及完成后的结果两种目录。让你练习时免于设定初始状态,照著书中所言,完成各个练习的步骤,且各步骤的说明多有图示,让你一目了然。当设计与撰写程序代码有疑义时,比照另一个已完成的项目,你可以参考正确设计来修改。

若没时间或耐心照着走,最起码开启与执行完整的范例项目一遍,关于 WF 的纲要也就了然于胸了J。而书中有些工作流程范例在直接开启时,因为需要参照的自定义活动尚未编译,其设计界面会呈现错误画面,你可以直接建置项目,而后设计画面就可以恢复正常。

本书的章节内容有相关性,尤其前几章的安排为循序渐进,最好先按部就班地读完第一和第二部分,而后浏览全书,再选择需要或有兴趣的部分精读。WF 是给系统开发人员的工具,本书的读者当然也属这个族群。若你不是系统开发人员,但要评估与工作流程或 BPM 相关的产品,或许略翻一下本书,将会对工作流程引擎有更深一层的认识。

相关阅读

书中提供许多关联到某项技术的网页,你可以延伸阅读。除此之外,笔者列出些相关的资源:

l   MSDN 自家对 WF 的主网页:http://msdn2.microsoft.com/en-us/netframework/aa663328.aspx。以及本书的勘误表:http://support.microsoft.com/kb/935354/en

l   Essential Windows Workflow Foundation:出版社 Addison-Wesley,作者 Dharma Shukla Bob SchmidtWF 的架构师和程序设计师合着的书,介绍 WF 底层的设计与运作原理。

l   工作流程设计模式(Pattern)的定义:在 http://www.workflowpatterns.com/ 这个网站里有用 Flash 绘制的各种工作流程设计模式动画,它与产品无关,但你可以据此了解何谓工作流程,以及应用上的变化。



[1] 曾经一开始 Windows Workflow Foundation 缩写为 WWF,因此你在微软相关技术文件内,还可以看到这样的缩写。谣传因为跟其他的注册商标冲到,而改称为 WF

[2] 组件形式通常设计成 DLL,一个 DLL内可以内含多个工作流程定义。但在笔者此次介绍的书中,强调当下的 WF 若将多个工作流程放在同一个组件中,当要一起执行时,会有 bug L。因此建议分开放置各个工作流程到不同的组件。

[3] 就这一版的 WF,笔者在练习建流程时,其工作流程与活动(Activity)的设计方式、对象命名等,与坊间其他的产品大异其趣。例如,想要做流程活动间的 ANDORNOT,或是与外界交换数据就很不直观。或许是锁定的族群不同,WF 的目标是程序开发人员,而坊间大部分的产品还期待系统分析师,乃至于用户自行参与流程设计。