第 1 章    欢迎来到工作流的世界

…思想如蝴蝶般飞到我身边 —— Gossard / Vedder

(译注:Gossard与Vedder是来自Pearl Jam乐队的2名乐手,该句出自他们的歌曲《Even flow》)

Windows Workflow可被看作是继COM+和分布式事务协调器(DTC)之后,Windows平台上最令人瞩目的一款中间件产品。它们之间的区别在于:不是每一个软件应用都需要进行分布式事务处理;但几乎每个软件都要在其内部实现工作流。为了能够领会微软设计Windows Workflow的初衷,让我们先从通常意义上的工作流谈起。

工作流是什么?简单地说,一个工作流就是为了完成一个特定任务而涉及的一系列步骤、决策和规则。想一想你在当地一家比萨饼店点餐这样一个流程。你先跟餐厅招待讲明想要哪款比萨饼。招待把点菜单传给厨师,厨师就着手把原料处理好并放入烤炉。稍后,厨师把烤好的比萨饼交给招待,招待把比萨送到你面前并跟你结账。至此,整个流程结束。这项工作先“流”向招待,然后“流”向厨师,最后又“流”了回来。

在上述每一个步骤中,所有参与者都进行了规则评估并做出决策。厨师在接受点菜单之前要先看看后厨的备料是否够用。在结账时,要是你拿出了优惠券,招待必定要看看它们是否有效;如果怀疑你用假钞付款,他还要通知餐厅经理。

工作流不一定非要有人参与其中(这点好啊,因为人可是有本事把最简单的过程都给搞复杂了)。一个工作流可能发生在两个分布式应用软件之间。例如,两个内容管理软件可能会在夜间通过应用一系列特定的操作和规则来实现二者间的内容同步。

大部分的工作流都是有状态的,而且经常会需要相当长的执行时间。幸运的是,你点的比萨饼会在30分钟内做好。在这段时间内,点菜单的状态信息,比如你已经点的比萨饼盖头,不能有变化。比萨饼店向供货商定奶酪的流程可跟你点比萨饼的不一样。供货商不可能在30个小时内都不把奶酪送来,比萨店也不会在30天内都不向供货商支付货款。在那30天中,对于一个交易来说,需要某种东西来维持其工作流状态。

一个工作流在其生存期内可能要花费大部分的时间等待来自外部世界的事件信息。在顾客等待上菜,招待等待顾客付款,或者厨师等待比萨出炉的时候,工作流会处于空闲状态。在这种情况下,工作流并不需要任何资源。

一个工作流就是为了完成一项任务而执行的一系列步骤。工作流经常会长时间地运行,而且它是有状态的,时常需要等待事件,并与人进行交互。你会发现工作流无处不在。作为程序员,我们经常要在自己开发的软件中实现工作流。

1.1         创建工作流解决方案

我们都有参与一些软件开发项目的经验,启动这些项目的目的就是想通过软件来改进现有的业务流程。这些流程可能是关于比萨饼订单的,关于金融交易的,或者是关于医疗保健的。无论如何,每当谈论到这些项目时,我们都不可避免的要碰到“工作流”这个老朋友。工作流看似简单,可是深入其中,你就会发现内藏的玄机。为了管理工作流状态,我们需要数据库表格和数据访问类。我们需要Email发送组件和队列消息等待组件。我们还要告诉计算机如何执行工作流。让我们先来看看理论上工作流是如何实现的:

// 这是一个处理新提交的采购订单的工作流
class PurchaseOrderWorkflow
{
public void Execute(PurchaseOrder order)
{
WaitForManagerApproval(order); NotifyPurchaseManager(order); WaitForGoods(order);
}

}

假设我们已经给出了Execute当中三个方法的定义,一个工作流看上去真的会如此简单吗?答案显然是否定的。我们必须要编写一些代码来实现异常处理、日志记录和诊断功能。我们需要引发事件并提供挂钩函数以便能够跟踪和取消正在运行的工作流。同时,这个工作流会在大部分时间里处于空闲状态并等待一个外部事件发生,比如说一直在等待供货商把已下单的货物送上门来。在等待到货的时候,我们不能让运行中的应用程序线程空空等上几天甚至几周。我们需要提供一种机制,它能够把工作流的执行状态保存到持久化的数据存储介质中,然后将这个正在运行的工作流实例从内存中清除。当有一个重要的事件发生了,我们还会恢复这个工作流的状态,并让它继续执行下去。

遗憾的是,这样一来,我们就会在工作流内部和外部添加太多的代码,以至于使自己迷失在工作流之中,颇有一种“不识庐山真面目,只缘身在此山中”的困惑。所有这些支持性代码会掩盖住我们正试图实现的业务流程。一个不懂技术的业务人员将永远无法透过这些代码看清其中的工作流。一个程序员如果不对代码仔细探查一番,也不会理清其中的工作流。

一种改进的工作流设计方法试图把工作流的定义与执行该工作流的引擎和支持性代码相分离。这种方法允许程序员,甚至是业务人员,来描述这个工作流 “应该做什么”,而让工作流引擎来决定“如何”让这个工作流去做。目前,许多工作流解决方案都是在广受欢迎的尖括号中定义工作流。让我们看看理论上使用XML定义工作流的方法。

<Workflow Name="PurchaseOrderWorkflow">
<Steps>
<WaitForTask Event="ManagerApproval"/>
<NotifyTask Target="PurchaseManager"/>
<WaitForTask Event="Delivery"/>
</Steps>
<Parameters>
<Parameter Type="PurchaseOrder" Name="order"/>
</Parameters>
</Workflow>

这里再问一句,一个工作流看上去真的会如此简单吗?这次的答案是肯定的;我们还需要一个能够理解这段XML并把它翻译成计算机指令的工作流引擎。这个引擎将包括所有必需的功能,比如异常处理、追踪以及取消执行功能。

 

我们在前面看到的C#代码是一个命令性编程方式的例子。在这种方式中,我们通过提供一系列可执行的指令来描述“如何”完成一项任务。上面的XML标记是一个声明性编程方式的例子。在这种方式中,我们对任务看上去是“什么”样子进行描述,而让其它软件来决定为了完成任务需要执行哪些步骤。软件市场上大部分的商业化工作流解决方案都允许使用声明方式定义工作流,因为这种方式不与异常处理、事件激发等低层次的实现细节搅合在一起。

使用XML的好处之一就是有大量的工具能够对XML标记码进行读取、修改、创建以及转换操作。也就是说,我们可以借助工具进行XML开发。与解析C#代码相比,XML标记码解析起来更容易,并且可以使用图形框和箭头为工作流生成可视化效果。反过来,我们也可以先让业务用户使用可视化设计器,通过把一些图形框相连的方式绘制出工作流框图,再从框图中自动生成XML标记码。

我们到底想从一个工作流解决方案中获得什么?我们想以声明方式对工作流进行描述,也许还需要一个可视化设计器来帮忙。我们想把工作流的定义输入到一个工作流引擎中。这个引擎会运行工作流,并对错误、事件、追踪、启用以及停用操作进行管理。

下面该Windows Workflow Foundation登场了。

章节链接:
【翻译习作】 Windows Workflow Foundation程序开发

【翻译习作】 Windows Workflow Foundation程序开发-前言

【翻译习作】 Windows Workflow Foundation程序开发-第一章01的更多相关文章

  1. 【翻译习作】 Windows Workflow Foundation程序开发-第一章05

    1.3      开发我们的第一个工作流 也许你曾经在这样的产品经理手下搞过开发:他总是在你身边转悠,并不时的问一句“你还没做完吗?”.在这一部分,我们将用一个简单的Windows Workflow程 ...

  2. 【翻译习作】 Windows Workflow Foundation程序开发-第一章04

    1.2.3  Windows Workflow运行时 从Windows Workflow的角度看,可以将工作流活动当成是交给一个工作流处理器去执行的一系列指令或操作码.在Windows Workflo ...

  3. 【翻译习作】 Windows Workflow Foundation程序开发-第一章03

    1.2.2.Visual Studio 2005扩展包 微软也为Windows Workflow开发者提供了Visual Studio 2005扩展包.扩展包将许多功能集成到Visual Studio ...

  4. 【翻译习作】 Windows Workflow Foundation程序开发-第一章02

    1.2      Windows Workflow概览 微软的Windows Workflow Foundation(简称WF)是.NET框架3.0版的一部分..NET3.0其它主要部分是Window ...

  5. 【翻译习作】 Windows Workflow Foundation程序开发

    近期整理硬盘,把09年的翻译习作<Windows Workflow Foundation程序开发>找出来了.现在又把译文过了一遍,做了些修改,贴出来献丑了.原书是<Programmi ...

  6. 【翻译习作】 Windows Workflow Foundation程序开发-前言

    Windows Workflow Foundation程序开发-基于XAML和C#的WF实战技术与例程 ——C#程序员的WF功能与编程接口技术指导 前言 Windows Workflow Founda ...

  7. 你还记得windows workflow foundation吗

    很多年前,windows workflow foundation还叫WWF,而直译过来的名称让很多人以为它就是用来开发工作流或者干脆就是审批流的. 博主当年还是个懵懂的少年,却也知道微软不会大力推一个 ...

  8. Workflow-Microsoft:Windows Workflow Foundation

    ylbtech-Workflow-Microsoft:Windows Workflow Foundation 1. Windows Workflow Foundation返回顶部 1.1. Windo ...

  9. 微信小程序开发-第一弹

    前言:       本篇文章为大家详细介绍微信小程序开发第一篇,后续步骤会逐步更新,欢迎大家关注. 第一步  注册        1.1 打开网址 https://mp.weixin.qq.com/  ...

随机推荐

  1. fiddler Android下https抓包全攻略

    fiddler Android下https抓包全攻略 fiddler的http.https的抓包功能非常强大,可非常便捷得对包进行断点跟踪和回放,但是普通的配置对于像招商银行.支付宝.陌陌这样的APP ...

  2. Django的列表反序

    Django虽然是python的web框架,但它不是所有的python特性都支持的. 最近在项目中遇到一个问题,需要在Django中将获得的列表反序排列,一开始我使用的是python的reverse方 ...

  3. Visual Assist 生成注释功能

    在Visual Studio环境中编码,Visual Assist是不可缺少的好工具.这工具功能非常强大,以前仅仅用到了代码提示,今天学习了生成注释功能,非常爽. 在代码编辑器中点击右键弹出菜单,在“ ...

  4. ajax实现--技术细节详解

    ajax原理和XmlHttpRequest对象 Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面.这其 ...

  5. 黄聪:jquery mobile通过a标签页面跳转后,样式丢失、js失效的解决方法

    问题描述: 用ajax跳转的时候,从a.html跳转到b.html后,b.html的css以及js都失效了. 解决办法1: 将所有的css以及js全部放在div内. 原理: 由于jqm的ajax跳转的 ...

  6. shell中大小写转换

    有两种方式: 1.用tr 例如:UPPERCASE=$(echo $VARIABLE | tr '[a-z]' '[A-Z]')   (把VARIABLE的小写转换成大写) LOWERCASE=$(e ...

  7. Spring初理解

    spring配置文件是一个xml格式的文件,类似如下: <beas> <bean id= 'a' class = '包名.类名'></bean> <bean ...

  8. BIP_开发案例01_BI Publisher报表手工提交和控制(案例)

    2014-12-27 Created By BaoXinjian

  9. hdu 5774 Where Amazing Happens

    Where Amazing Happens 题意: 让你输出各个队名的出现次数. 题解: 打表题,好坑,相同的没有放在一起,需要认真找,否则容易错. 代码: #include<iostream& ...

  10. 在一个窗口中显示多个视频,并在每个子窗口左上角显示系统时间,函数cvShowManyImages是改写的

    #include <cv.h> #include <highgui.h> #include <stdio.h> #include <stdarg.h> ...