zoukankan      html  css  js  c++  java
  • Windows Workflow Foundation技术介绍(基于.NET Framework 4.5)

    Windows Workflow Foundation技术介绍(基于.NET Framework 4.5)

    转自:http://www.cpiso.cn/jsyj/ghxx/2014/5/15/459.shtml

    Microsoft Windows Workflow Foundation (WF) 是一个可扩展框架,用于在 Windows 平台上开发工作流解决方案。Windows Workflow Foundation 同时提供了 API 和一些工具,用于开发和执行基于工作流的应用程序。Windows Workflow Foundation 提供单个统一的模型,以便创建跨越多个类别应用程序的端到端解决方案,包括人力工作流和系统工作流。
        Windows Workflow Foundation 是一个广泛且通用的工作流框架,并且从下到上、在每个级别都针对可扩展性进行了设计。基于 Windows Workflow Foundation 的解决方案,由得到 Microsoft .NET 代码支持且在宿主应用程序中运行的互连组件组成。就像在定制的环境中以可视方式创建 Web 页一样,您需要在可视设计器中制订特定工作流的步骤,并且添加代码隐藏工作流组件以实现规则并定义业务过程。
        Windows Workflow Foundation 在构建工作流程时具有很强的优势。
        1、Windows Workflow Foundation 提供了一套高度抽象和可视化的商业处理模型,这套模型可以非常容易地使用和被理解,无论使用它的是开发人员或是商业领域专家。
        2、Windows Workflow Foundation 可以非常容易地改变与之相关的商业处理规则,并且不必重新编译。
        3、Windows Workflow Foundation 编程模型可以使开发人员建立一套可测试的内核集合,并且可以在多个程序中使用它们。
        Windows Workflow Foundation 是一个专门控制工作流的程序,它为开发工作流提供了框架、模型、工作流引擎、.NET 托管API、运行库服务以及与 Microsoft Visual Studio 集成的可视化设计器和调试器,可使用 Windows Workflow Foundation 来生成并执行同时跨越客户端和服务器端的,可在所有类型的 .NET 应用程序内部执行的工作流。
        Windows Workflow Foundation 的核心是一组 Activities 活动,通常在宿主程序中被创建。它们通过工作流引擎来运行工作流程,管理工作流的状态,通过运行时服务与工作流进行通信。宿主程序可以是任何类型的程序,在开发工作流项目时,首先在宿主程序中创建工作流引擎,然后在引擎中加载各种所需的服务,最后通过引擎启动指定的工作流并生成工作流的实例。
        宿主程序与工作流之间进行数据交换是通过通信 Service 服务,另外也可自行设计通信信道,定义一些接口,使宿主程序与 Windows Workflow Foundation 中一些特殊的 Activity 活动采用事件传递参数的形式进行通信,来交换数据;同时还可以通过外部事件以及持久化等方式实现通信。当一个工作流实例运行时,可以伴随其运行许多服务,这些服务均采用可插式调用,即这些服务是为了满足不同的工作流运行实例的需求,从而伴随实例运行的。
        加载工作流持久化服务(PersistenceService)可以将工作流实例从工作流引擎中移出,存入持久性介质,以及从介质中将实例载入工作流引擎中。WorkflowPersistenceService 类是使用数据库对工作流状态进行持久化的服务,实例使用 Unload 方式通过加载到引擎中的 WorkflowPersistenceService 服务,完成实例的内存移出与保存到数据库的操作,引擎使用 GetWorkflow 方法,可通过 WorkflowPersistenceService 服务将存于数据库中的实例加载并返回,实例使用 Load 方法可触发引擎的 WorkflowLoaded 事件。
        跟踪工作流及其节点状态是工作流平台的核心功能 Windows Workflow Foundation 提供的 Tracking 服务用以跟踪工作流的执行状态,工作流执行过程中会有各种状态的改变,Tracking 能将这些状态改变信息记录到数据库并提供查询端口。另外在封装类中还实现了对自定义服务的加载,同时负责工作流引擎的启动,并保证工作流引擎的唯一性。
        在开发工作流系统时,Windows Workflow Foundation 使程序语义更具声明性且准确性增强,方便用户为接近实际进程的应用程序建模,并将 WindowsWorkflow 嵌入运行时服务器。进程越复杂,为其设计和实现的流程就越简单,进程动态更改越容易,用户需要编写和维护的代码数量就越少。Windows Workflow Foundation 运行时为工作流程序提供了托管执行环境,还为程序提供了持续时间、可靠性、挂起/恢复、事务以及补偿特征。
    1 WINDOWS 工作流概念性概述
    1.1 WINDOWS 工作流概述
        工作流是由以活动作为基本单元的一个模型,用于描述实际进程。工作流提供了一种方法,用于描述多项短期运行或长期运行的工作之间的执行顺序和依赖关系。此工作从头到尾地贯穿模型,并且活动可以人工执行或由系统功能执行。
    1.1.1 工作流运行时引擎
        每个正在运行的工作流实例都是由进程内运行时引擎创建和维护的,宿主进程通过以下三种方式与其交互:
        WorkflowInvoker,它像调用方法一样调用工作流。
        WorkflowApplication,用于对单个工作流实例的执行进行显式控制。
        WorkflowServiceHost,用于多实例方案中基于消息的交互。
        上述每个类将在核心活动运行时作为负责执行的活动实例进行包装。在一个应用程序域中可以并发运行多个活动实例对象。
        上述三个宿主交互对象中的每一个都是从名为工作流程序的活动树中创建的。使用这些类型或对活动实例进行包装的自定义宿主,可以在包括控制台应用程序、基于窗体的应用程序、Windows 服务、ASP.NET 网站和 Windows Communication Foundation (WCF) 服务在内的任何 Windows 进程内执行工作流。
        宿主进程中的工作流组件(图1)
     


    1.1.2 工作流组件之间的交互
        下图演示工作流组件彼此之间如何进行交互(图2)
     


        在上图中,Invoke() 方法的 WorkflowInvoker 类用于调用几个工作流实例。 WorkflowInvoker 用于不需要由宿主管理的轻型工作流;需要由宿主管理的工作流(如 Bookmark 恢复)必须改用 Run() 来执行。无需等待一个工作流实例完成即可调用下一个工作流实例;运行时引擎支持同时运行多个工作流实例。调用的工作流如下:
        一个包含 WriteLine 子活动的 Sequence 活动。 Variable 的父活动是绑定到 InArgument 的子活动。
        一个调用 ReadLine 的自定义活动。将 ReadLine 活动的 OutArgument 返回给调用 Invoke() 方法。
        一个派生自 CodeActivity 抽象类的自定义活动。 CodeActivity 可以使用作为 Execute(CodeActivityContext) 方法的参数提供的 CodeActivityContext 访问运行时功能(如跟踪和属性)。
    1.2 WINDOWS 工作流基础概念
    1.2.1 工作流与活动
        工作流是构成进程模型的操作的结构化集合。工作流中的每个操作都建模为一个活动。主机将 WorkflowInvoker 用于调用工作流(就好像是一个方法),将 WorkflowApplication 用于对单个工作流实例的执行进行显式控制,并将 WorkflowServiceHost 用于在多实例方案中进行基于消息的交互,从而实现与工作流的交互。由于工作流的步骤定义为活动的层次结构,因此层级中最顶端的活动可以认为是定义工作流本身。此层次结构模型替代以前版本中的显式 SequentialWorkflow 和 StateMachineWorkflow 类。活动自身可作为其他活动的集合(使用 Activity 类作为基础,通常使用 XAML 定义)开发;或者使用 CodeActivity 或 NativeActivity 类进行自定义创建,前者可以使用运行时进行数据访问,而后者则向活动作者公开工作流运行时范围。使用 CodeActivity 和 NativeActivity 类开发的活动是使用符合 CLR 的语言创建的,如 C#。
    1.2.2 活动数据模型
        活动使用下表中所示的类型存储和共享数据。(表1)

    1.2.3 工作流运行时
        工作流运行时是工作流进行执行的环境。WorkflowInvoker这是执行工作流的最简单的方法。宿主为以下操作使用WorkflowInvoker:
    1、以同步方式调用工作流。
    2、向工作流提供输入或从其中检索输出。
    3、添加供活动使用的扩展。
        ActivityInstance是线程安全的代理,宿主可以使用该代理与运行时进行交互。宿主为以下操作使用ActivityInstance:
    1、通过创建实例或从实例存储区中加载实例的方法来获取实例。
    2、接收实例生命周期事件通知。
    3、控制工作流执行。
    4、向工作流提供输入或从其中检索输出。
    5、向工作流发出继续信号并将值传递到工作流中。
    6、保存工作流数据。
    7、添加供活动使用的扩展。
        活动通过使用相应的ActivityContext派生类获得访问工作流运行时环境的权限,例如NativeActivityContext或CodeActivityContext。这些元素使用此类来解析参数和变量,以便安排子活动和实现多种其他用途。
    1.2.4 服务
        工作流提供一种使用消息活动实现和访问松耦合服务的自然方法。消息活动建立在WCF上,目的是完成工作流数据的输入与输出。可将消息活动组合在一起,以对任何你希望的消息交换模式进行建模。
    1.2.5 持久性、卸载和长时间运行的工作流
        Windows 工作流通过提供以下功能,简化了创作长时间运行的反应式程序的过程:
        访问外部输入的活动。
        能够创建可由宿主侦听程序恢复的 Bookmark 对象。
        能够保存工作流数据并卸载工作流,然后作为对特定工作流中恢复 Bookmark 对象的响应,重新加载和重新激活工作流。
        工作流会持续地执行活动,直到没有任何要执行的活动或者所有当前正在执行的活动均在等待输入为止。在后一种情况下,工作流处于空闲状态。通常宿主会卸载进入空闲状态的工作流,并在收到消息时将其重载到继续执行。WorkflowServiceHost为此功能提供功能,并提供了可扩展的卸载政策。如果在执行块中使用可变状态数据或无法保存的其他数据,活动可以使用NoPersistHandle向宿主指示不应保存它。工作流还可以使用 Persist 活动将其数据显式保存到持久性存储介质中。
    1.3 WINDOWS 工作流体系结构
        Windows Workflow Foundation (WF) 提升了开发长时间运行的交互式应用程序的抽象级别。工作单元封装为活动。活动运行环境提供用于流控制、异常处理、错误传播、状态数据保存、从内存加载和卸载正在进行的工作流、跟踪以及事务流的功能。
    1.3.1 活动体系结构
        活动作为 CLR 类型开发,这些类型或者派生自 Activity、CodeActivity或AsyncCodeActivity,或者派生自返回某个值的对应NativeActivity、Activity<TResult>、CodeActivity<TResult> AsyncCodeActivity<TResult>或NativeActivity<TResult>变体。通过开发派生自 Activity 的活动,用户可以组合预先存在的活动,以便快速创建在工作流环境中执行的工作单元。另一方面,CodeActivity支持通过将CodeActivityContext主要用于访问活动参数,在托管代码中创作执行逻辑。AsyncCodeActivity类似于CodeActivity除外,它可以用于实现异步任务。通过开发派生自NativeActivity的活动,用户可以通过NativeActivityContext访问运行时,以实现安排子级、创建书签、调用异步工作、注册事务等功能。
    1.3.2 活动上下文
        ActivityContext是活动作者的工作流运行时接口,提供对诸多运行时功能的访问。下面的示例定义一个使用执行上下文创建书签(一种机制,允许活动在其执行中注册一个延续点,该延续点可由将数据传入活动的主机恢复)的活动。
    1.3.3 活动生命周期
        活动实例启动时处于 Executing 状态。除非发生异常,否则活动将保持此状态,直到已完成执行所有子活动和所有其他挂起的工作(如 Bookmark 对象),此时,该活动将转换为 Closed 状态。活动实例的父级可以请求取消子级;如果可以取消子级,该子级处于 Canceled 状态时完成。如果在执行期间引发异常,运行时会使将活动推入 Faulted 状态,并将此异常向上传播到活动父链。下面列出了活动的三个完成状态:
        已关闭:活动已完成其工作并退出。
        已取消:活动已正常放弃其工作并退出。当进入此状态时,不会显式回滚工作。
        出错:活动已遇到错误,并且在未完成其工作的情况下退出。
        当保存或卸载活动时,活动会保持 Executing 状态。
    2 工作流应用场景
    2.1 文档审批过程
        这个用例结合了很多WF4.0和WCF的功能。使用这两种技术实现了一个文件的审批。包括一个客户端应用程序,它提交文件、审批文件;审批流程管理应用程序方便客户端之间的通信,并执行该审批程序的规则。这个用例中有3种类型的审批工作流程:
        1、一个简单的审批流程
        2、一个quorum审批流程
        3、一个复杂的审批流程
    其流程架构图如下(图3):
     


    从客户端来看,审批流程有如下功能:
    1、在客户端可以申请一个用户
    2、客户端的WCF调用服务端的WCF服务。
    3、一个唯一的user ID返回给客户端,此时用户才可以开启一个审批流程。
    4、客户端可以发起一个审批文件,进行简单的、quorum或复杂的审批程序。
    5、在客户端的界面审批按钮被点击后,在客户端工作流服务宿主中启动一个工作流实例。
    6、工作流向服务端发送一个审批请求。
    7、服务端自身也启动一个工作流,回应审批流程。
    8、一旦执行完服务端的审批工作流,就结果发送回客户端。
    9、客户端显示的结果。
    10、客户端会收到审批请求,可以在任何时间响应审批要求。
    11、宿主在客户端的WCF服务可以收到来自服务端的审批要求。
    12、呈现审查的文件资料。
    13、用户可以批准或否决该文档。
    14、WCF客户端发送一个响应返回给服务端。


    从服务端的角度来看,审批程序功能如下:
    1、客户端请求参与审批流程。
    2、服务端的WCF服务能接受客户端请求
    3、为客户端生成一个唯一的ID。将用户信息存储在数据库中。
    4、唯一的ID发送回给用户。
    5、接受审批请求,执行审批流程
    6、收到一个请求批准理,开启新的工作流程。
    7、根据请求的类型(简单,quorum,或复杂),不同的工作流活动被执行。
    8、相关的发送和接收活动被用来给客户端发送请求批准的审查和等待接收响应。
    9、此次批准的工作流的结果发送到客户端。


    示例:
    1、 启动服务端后启动四个客户端,并完成与服务端连接(图4)
     

    图5:
     
    2、 分别申请用户(对应三种用户类型)
    见图6

    3、 创建一个复杂文件审批流程
    见图7

    4、 A用户提交后B、C将收到审核任务,可以选择同意与否决
    见图8

    5、 B、C同意后,审批任务将送达到D
    见图9 

    6、 D审批提交后,A将收到反馈信息,审批流程结束
    见图10
     

  • 相关阅读:
    Swift8-枚举Enumerations
    Swift7-闭包
    Swift6-函数
    Swift5-控制流
    Swift4-集合类型
    什么是node.js
    nodejs的安装
    环境变量的认识,,,
    shell是什么,各种shell的初步认识,适用于初学者
    exports和module.exports的区别
  • 原文地址:https://www.cnblogs.com/nearpengju123/p/4278115.html
Copyright © 2011-2022 走看看