工作流的应用
基于WF的工作流平台

为什么写这篇文章?

在博客园上有很多关于WF技术的文章,也有一些对WF的议论,发现大家对WF认识上有很多不清楚的地方,也有太多的误解。

有的人一遇到困难就认为WF设计的不好,其实WF这么做肯定是有它的道理的,如果你能顺着它的思路走,问题就能解决,至少我们遇到问题都是这么做的。

还有的人WF项目没有做成功,就说WF不能用。其实一个工作流项目的成功只有流程相关的那30%和WF有关,其他的70%都是和WF无关的;有多少人能保证即使不使用WF也一定成功呢?至少我见过的绝大多数项目都只能说是完成,而不能说是成功,因为开发人员对自己的要求太低,只求能用,完全不考虑优化。

我们的项目从07年10月启动,到08年4月完成,完全满足了客户复杂的需求,工作流平台随后被应用到三个新项目之中,其中两个已经上线运行。工作流平台是在第一个项目之中完成的占50%工作量,所以成本为零,但完全复用到其他项目。其他项目的开发人员不需要进行WF的培训,直接进行开发,流程开发几乎不需要编写代码,只要编写业务界面。

我们的平台不论从技术还是市场角度都是非常成功的,这一切都要感谢WF,说实话要我说出WF有什么问题,我还真提不出来,相对我的水平来说WF是完美的;所以我想替WF说几句公道话。

WF和现有工作流产品在应用范围上的区别

为什么很多人感觉WF和自己以前接触过的工作流产品大不相同,用起来比较麻烦,主要是因为现有的工作流产品和大多数我们的应用都面向的是企业应用;而WF的应用范围要广得多,从工业控制、企业应用到商业应用等等,他实现的是所有种类工作流应用的一个子集,比如工业控制中的工作流就不需要企业应用中所必须的组织结构和角色管理等,但他们流程逻辑却可能一样复杂。

WF是工作流领域的一个划时代产品,他解决了工作流应用中难度最高的引擎部分,并且可以应用于几乎所有的工作流应用领域。相对引擎而言,构建于WF之上的应用的设计开发难度大大较低,只需要较少的投入就可以实现很好的工作流产品。

为什么要用WF

开发工作流引擎的难度太高

很多人说WF用起来这么麻烦,还不如自己做呢!我想可能是因为这些人还没有遇到复杂的需求,或者对工作流引擎的难度认识还不够吧。我见过三家公司开发自己的工作流产品,每家开发的原因都各不相同,其中一家还投入了数百万,但无一例外都没有成功。而WF成功的背后是什么呢?流程设计器有微软在Visio上十几年的积累,流程文件XAML有微软在XML上十几年的积累,引擎有微软在SharePoint和BizTalk等多个版本的积累,没有这些积累,是做不了一个成功的工作流引擎的。WF出来以后就不要再想着开发自己的工作流引擎了。

WF是最好的工作流引擎

WF有很多的特性,但对我看来最重要的是下面两个特性:

细粒度的流程设计模式:WF是面向开发者的工作流引擎,它的Activity非常多,虽然每个Activity都只实现最基本的功能,但采用这些Activity设计出的流程可以非常复杂,非常灵活;现有的其他一些工作流产品,既想讨好开发者,又想讨好用户,结果两头都不靠,要么只能实现一些简单的流程,要么对于复杂的流程实现起来非常麻烦。

状态机和顺序流的分离:状态机是工作流的基础理论,只要流程中有退回操作,就涉及到状态机;我们在画逻辑图的时候可以把整个流程只画到一个图上,如果我们直接实现这个流程图,就会遇到状态的入口问题;而状态机和顺序流的分离很好的解决了状态入口的问题,,

WF企业应用的模式

上面我们说了WF仅仅实现了工作流引擎的功能,如果我们直接在上面进行应用的开发,会遇到很多困难,工作量也会非常大。所以我们必须首先实现一个工作流平台层,在这层上才可以方便的进行应用的开发。

我们将WF企业应用的模式分为三层,每层完成工作流应用的一部分功能。

 

工作流引擎层

工作流引擎层解决的是流程驱动的问题,就是下一步做什么?这一层的功能已经由WF为我们实现了,对于所有类型的流程,这一层都是相同的。

工作流平台层

工作流平台层解决的是角色驱动的问题,就是由谁来做?这一层的功能我们需要自己实现,为什么WF没有为我们实现呢?一、这不是工作流的通用需求,企业应用需要,但工业应用并不需要;二、每类企业对角色的驱动的模型是不同的,有的企业角色是一维的,有的企业角色是二维的,没法实现一个完全通用的角色驱动模型。

工作流平台层是WF应用的关键,一个设计良好的工作流平台层能够封装引擎层,使流程的开发只需绘制流程图,不需编写代码;角色的驱动也能够满足各种复杂的逻辑。

业务应用层

业务应用层解决的是用户交互的问题,就是怎么做?这一层是传统的用户界面设计,有时需要根据流程的当前节点,控制用户可以进行的操作。在这一层我们可以通过扩充ASP.NET的数据访问控件,来提高页面开发的效率。

对工作流平台层的技术要求

WF已经为我们实现了难度最高的工作流引擎层,我们只需要实现工作流平台层,就可以方便的进行业务流程的开发;工作流平台层的技术难度相对工作流引擎虽然已经大大降低,但仍然高于一般的项目开发,还需要较高的架构设计和技术能力,才能成功的实现工作流平台。

明确的需求

前面说到为什么WF没有实现一个工作流平台,是因为无法实现一个通用的企业数据模型;我们也只能根据具体项目的需求和技术实现的风险,确定工作流平台的初步架构,然后不断的根据其他项目进行扩充,从而实现多个项目的超集。所以要求我们必须非常清楚客户的需求,这样才能架构适用的工作流平台。

较高的架构设计能力

架构设计能力是实现工作流平台的关键,有两点要求,一是要能够利用WF来实现业务流程,二是要把所有流程中公共的代码提取到平台中。架构能力是设计出来的,不是学出来的,没有几年的设计经验,是很难架构一个较好的工作流平台的。

较高的技术能力

WF是一项非常复杂的技术,学习起来已经很不容易,应用就更难了,有时遇到问题,不得不查看他的源代码才能解决。WF会涉及到.NET技术的方方面面,所以没有几年的.NET技术基础,要熟练应用WF还是比较困难的。

为什么很多WF应用没有成功

很多人很看好WF,也在项目中投入了很大的人力,但项目实施效果不理想,要么不能满足用户需要,要么开发量太大,甚至于项目没有成功。下面是几种常见的情况:

没有应用状态机

只要涉及到流程的退回就应该应用状态机,我们一般把逻辑图都画在一张图上,直观上就想通过顺序流来实现它,所以有些人花了大量的精力来通过顺序流实现状态机的功能,到头来还是不能满足用户要求。

没有封装工作流引擎

WF中有很多例子,有些人依葫芦画瓢,照着例子做应用;这些例子仅仅是用来说明WF技术的,它为每个流程都定义一个接口,为每个操作定义一个事件,如果应用开发中也这么做,会极大的加重开发和维护的工作量。而实际上所有的流程可以共用一个接口,可以只为每类操作定义一个事件。

业务和平台混杂

平台的一个目标就是把业务中所有重复的代码抽取出来,业务中就不再包含平台的代码;而如果把两个混杂在一起,必定会有大量的平台代码冗余在业务代码中,增加了开发维护的工作量、架构的复杂性和系统的风险。

技术难题

WF由于技术难度较高,在开发中会遇到很多难以解决的技术问题,有些问题就像鸿沟,跨不过去就只有死在下面;有些问题就像瑕疵,解决不了就不能满足用户的需求;这些问题有时会困扰我们很多天才解决,不知道求助微软有没有帮助,我们都是自己硬啃下来的,好像没有什么捷径。

 

后面文章我们会介绍在工作流项目中流程相关的需求,及平台的架构

 

posted on 2008-07-21 17:32 Walter Z 阅读(1508) 评论(14)  编辑 收藏
Comments
  • 包建强      
    Posted @ 2008-07-21 17:44
    话说
    好久不见
    WXWinter(冬)
    的文章了   回复  引用  查看    
  • #2楼 
    李涛      
    Posted @ 2008-07-21 17:54
    最近想出一个WF的培训课题,看到这样的文章还不错。
    目前觉得中小企业在工作流实施方面还很欠缺,目前培训大家可能更看中协同办公的工作流实施,以及MOSS方面的应用.
    期待更好文章!!!   回复  引用  查看    
  • #3楼 
    吴兵 [未注册用户]
    Posted @ 2008-07-21 18:11
    学习一下.   回复  引用    
  • #4楼 
    gqzhao      
    Posted @ 2008-07-21 18:25
    期待楼主能结合一个具体的业务模型来深入探讨,这样更有意义。   回复  引用  查看    
  • #5楼 
    磨剑      
    Posted @ 2008-07-21 18:36
    到目前为止,不是很看好wf,仅仅是最底层的东西,一切都需要开发,甚至一个工作流也需要开发,没有设计工具,大的软件公司对此不感兴趣,宁可用已有的不是很“强大的”工作流系统,而对小公司开发难度太大,他们很难想象,在没有设计器的情况下,新建一个工作流要写程序,他们的客户也很难想象,要加一个新的流程要找开发工资开发................
    当然,wf目前仅仅是开始,等用的人多了,这种状况改观之后,应该会有较大幅度的应用,毕竟,.NET,可用的工作流系统不多,不花钱就能让开发者接触到核心部分功能的就更少,何况,那些花钱的都巨昂贵   回复  引用  查看    
  • #6楼 [楼主]
    Walter Z      
    Posted @ 2008-07-21 18:40
    @包建强
    你好像把两个人搞混了

    @李涛
    WF的实践性很强,培训应该是面向软件企业,面向中小企业的应该是工作流平台方面的。

    @磨剑
    我写了这么多,看来你还没有理解WF,WF有自己的方向和目标,它至少让我实现了很多在以前看来是不可能的工作流应用。当然难度是有的,关键是方法。
    Visual Studio 中的WF流程设计工具可是最优秀的,把它独立出来也不是太难的事。

    @gqzhao
    我会写一个系列,从需求到架构
      回复  引用  查看    
  • #7楼 
    MHL      
    Posted @ 2008-07-21 22:50
    关注,我也是刚用WF,因为项目中要用到流程的东西.
    我大概想了一下.做一个用户控件
    大概的样子是


    审批意见:输入
    审批结果:列出State的里面的事件
    确定

    控件接收一个 InstanceId和UserId
    这样就可以确定当前State

    发起流程像这样

    Guid flowguid = WorkFlowHelper.StartMyWorkflow(typeof(JTSCM.WorkFlow.QuoteFlow), signatureEntity);
    Response.Redirect("TestFlow.aspx?guid=" + flowguid.ToString());


    希望楼主能做出一个比较帅的东东,支持了..

    有机会可以聊聊呀?
    QQ:89148614
    MSN:mmmhhhlll@hotmail.com

    工作流我有好多不懂的.有机会也请教一下呀..   回复  引用  查看    
  • #8楼 
    m j [未注册用户]
    Posted @ 2008-07-22 09:24
    我们项目中用了WF但用得很差。。非常期待楼主的下文。。   回复  引用    
  • #9楼 
    酱板猪      
    Posted @ 2008-07-22 09:53
    太抽象了,,,
    如果真的在WF上有丰富的经验,应该拿一个具体的实例出来讲讲,,
    关注WF的基本上都理解WF的一些基础知识了,所缺乏的正是如何把WF正确的运用到项目中。。   回复  引用  查看    
  • #10楼 [楼主]
    Walter Z      
    Posted @ 2008-07-22 10:57
    @酱板猪
    做事有前因后果,下面我们写具体做法的时候,就不用解释为什么要这么做了。   回复  引用  查看    
  • #11楼 
    酱板猪      
    Posted @ 2008-07-22 11:24
    TO:楼主
    SORRY,
    可能你误解我的意思,
    我的意思是希望能用一个具体的实例来讲解下WF,谢谢你的分享
      回复  引用  查看    
  • #12楼 [楼主]
    Walter Z      
    Posted @ 2008-07-23 09:19
    @酱板猪
    我们后面就会结合项目的需求进行讲解,但主要是架构和设计层次的,假设大家都已具有相当的设计水平,对WF也有足够的了解。
      回复  引用  查看    
  • #13楼 
    FUG [未注册用户]
    Posted @ 2008-07-26 15:13
    分析的很精辟期待你的精彩展现   回复  引用    
  • #14楼 
    王仕超      
    Posted @ 2008-08-12 17:15
    关注,曾经封装过WF,但后应某些原因还没有等到推广和应用,期待和楼主交流,学习   回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-22 10:26 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: