当前位置:
文档之家› Windows工作流(WF)框架介绍
Windows工作流(WF)框架介绍
CreateWorkflow(typeof(BoilerWorkflow)); CreateWorkflow(XmlTextReader.Create(“ Workflow.xml"));
WorkflowSchedulerService;
WF运行时从不自己创建线程,它利用此运行时服务来获取运行 WF程序实例所需的线程;
Wor载的,可以使用现成的 SqlPersistenceService,也可以基服务类派生可以创建自 定义服务;
用于管理工作流实例的公共核心服务:
WorkflowLoaderService; WorkflowSchedulerService; WorkflowPersistenceService;
工作流的开发环境:
VS2008
是首选,但并不是必须; 除此之外,似乎没有更适合的开发工具; 可以自定义设计器及其活动的样式;
概览 WF简介 设计目标 WF Services架构 活动(Activity) 服务(Service) Demo(烧水器状态机工作流开发)
WF是通用的编程模型、引擎和工具:
概览 WF简介 设计目标 WF Services架构 活动(Activity) 服务(Service) Demo(烧水器状态机工作流开发)
引子:
是继COM+,DTC之后来到Windows平台的又一 意义重大的中间件
我们说也许很多场景用不上COM+,但工作流在应 用系统中无处不在; 例子:去麦当劳吃饭;
至此,我们已经勾画出Proton的核心逻辑了,然而,或者你已经注意到 了,HandleBoilerRequest和NotifyBoilerIdle的右上角都有一个红色的叹号 ,它的出现意味着这些活动缺少一些必要的设置。
状态机工作流的开发; 工作流实例和外界的通信; 工作流实例的承载(hosting); 工作流实例的持久化与状态管理。
实现类BoilerService (必须打上SerializableAttribute),定义的 NotifyBoilerIdled方法和BoilerRequest事件是给烧水器工作流使用的,而 BoilerIdled事件和NotifyBoilerRequest方法则是给宿主应用程序使用的。
[Serializable] public class BoilerService : IBoilerService { public event EventHandler<BoilerIdledEventArgs> BoilerIdled; public void NotifyBoilerIdled(Guid instanceId, string userId) { if (BoilerIdled != null) { BoilerIdledEventArgs e = new BoilerIdledEventArgs(instanceId, userId); BoilerIdled(null, e); } } public event EventHandler<BoilerEventArgs> BoilerRequested; public void RaiseBoilerRequestedEvent(Guid instanceId, string userId) { if (BoilerRequested != null) { BoilerEventArgs e = new BoilerEventArgs(instanceId, userId); BoilerRequested(null, e); } }
概览 WF简介 设计目标 WF Services架构 活动(Activity) 服务(Service) Demo(烧水器状态机工作流开发)
初衷:
使程序的异步调用更加容易; 使分布式模型与逻辑单元的通讯更加灵活; 易于变更; 给客户提供更严谨的商务控制策略和流程;
实现目标:
基于Window平台的为微软产品及相关应用程序提供通 用的工作流设计平台和开发工具; 可用于跨应用场景:与产品、行业没有关系; 卓越的可扩展性:提供了类库,可扩展框架及API; 简单、直观的与.net开发融为一体的开发环境; 是Office12工作流引擎的基础部分;
概览 WF简介 设计目标 WF Services架构 活动(Activity) 服务(Service) Demo(烧水器状态机工作流开发)
WF运行时是一个服务的容器:
AddService(); Getservice(); RemoveService();
用于管理工作流实例的公共核心服务:
WorkflowLoaderService;
钝化服务默认是没有加载的,可以使用现成的 SqlPersistenceService,也可以基服务类派生可以创建自定义 服务; 允许工作流长期保持活动状态并在应用程序重新启动之后存在;
TrackingService(是一项功能);
用于指定并捕获有关工作流实例的信息,并在这些实例执行时 存储该信息; 现成的SqlTrackingService,该跟踪服务可以跟踪三种类型的事 件:工作流实例事件、活动事件和用户事件;
工作流通信服务
Windows Workflow Foundation 工作流通信服务实现一种供对象与 工作流实例通信的简单机制。 通信通道的定义是一个接口,其实现 是添加到运行时以方便通信的服务类; 对于服务类,工作流的行为很像任何其他类,您通过引发事件和接 收方法调用与其通信。 对于工作流,通信接口显示为包含入站事件 接收和出站操作方法调用的通道; ExternalDataExchangeService 将接口上的外部方法声明转换为服 务对象上的方法调用。 我们可以视为本地服务的类能够引发事件, 工作流运行时引擎截获这些事件并将其作为工作流的入站消息加以 传送。
工作流的简单定义:
是一序列步骤、决策以及为达成特定任务而制 定的规则;
并非所有工作流都需要人参与,如分布式内容管理 系统在深夜按一定步骤及规则同步各服务器的数据; 还有一些工作流与状态有关,如写一份立项建议书 的流程;
微软对工作流定义:
工作流是一组存储为模型的名为活动的基本单元,活 动用于描述实际进程; 工作流提供了一种方法,用于描述多项短期运行或长 期运行的工作之间的执行顺序和依赖关系; 此工作从头到尾地贯穿模型,并且活动可以人工执行 或由系统功能执行。
工作流模型:
一个行为便是一个类; – 包含了一系列的属性,方法和事件; – 复合行为管理子行为集; – 工作流即是一个特殊的复合行为; 工作流和行为可以被工作流模型的API定义;
Activity:
Workflow的基本元素; 可以是原子化的任务; 也可以是组合了多个activity的节点; 可以被动态添加到用XML DOM表示的节点中; 如果一个workflow中的路径上的所有Activity都运 行完毕,该workflow就完成了;
当烧水器接到后,它就会开始工作,假如为保护烧水器使用完毕延迟 10秒关机,DelayActivity是最合适不过了,而10秒后的给外部调用者通知“ 我已空闲,可以接收新的请求”,CallExternalMetodActivity就可以干这个 。在BoilerWorkingState里添加DelayActivity和CallExternalMethodActivity ,并分别命名为delayOff和notifyBoilerIdled。
概览 WF简介 设计目标 WF Services架构 活动(Activity) 服务(Service) Demo(烧水器状态机工作流开发)
状态机工作流的开发; 工作流实例和外界的通信; 工作流实例的承载(hosting); 工作流实例的持久化与状态管理。
状态机工作流 描述
烧水器的状态不外乎就两个:空闲状态和工作状态。刚 买回来的时候,它的状态是空闲的,自第一个用户开始, 它就不断地在两个状态之间切换:工作状态、空闲状态、 工作状态、空闲状态…… 直到它因为老化或者损坏而不 能工作为止;
组件:
Base Activity Library:内置的 基本的Activity; Runtime Engine:运行 Workflow与状态管理; Runtime Services:宿主 Workflow与通讯; Visual Designer:控件,可以 在应用程序中调用设计器;
概览 WF简介 设计目标 WF Services架构 活动(Activity) 服务(Service) Demo(烧水器状态机工作流开发)
[ExternalDataExchange] public interface IBoilerService { void NotifyBoilerIdled(Guid instanceId, string userId); event EventHandler<BoilerEventArgs> BoilerRequested; }
创建状态机工作流库
定义及组织工作流活动; 定义通讯服务接口; 创建通讯服务实现类;
创建宿主应用程序项目
初始化工作流运行时并启动; 触发“烧水请求”事件; 订阅“烧水服务空闲”通知事件;
一、为烧水器创建-状态机工作流库:
1、烧水器的状态机工作流设计:
BoilerIdleState:被设为初始状态(Initial State)。或许你已经发现了 ,这个状态机没有完成状态(Completed State),正如烧水器自买回来 的那一刻起就不会有所谓的"用完",一般所说的"用完"只是"空闲"的一个别 称,只要烧水器还能使用,我们就会一直用下去,同样的道理,烧水器状 态机模拟了这个过程,这就是为什么它没有完成状态。 当烧水器处于空闲状态时,它实际上是在等别人来用,用行话说,就是监 听外部的请求事件,于是,我们需要在StartBoiling里添加一个 HandleExternalEventActivity,并命名为HandleBoilerRequest: