1、VS2008是首选,但并不是必须;除此之外,似乎没有更适合的开发工具;可以自定义设计器及其活动的样式;,Agenda,Agenda,概览WF简介设计目标WF Services架构活动(Activity)服务(Service)Demo(烧水器状态机工作流开发),WF简介,WF是通用的编程模型、引擎和工具:并非新技术;但有别于以前的模式;是一个框架,而不是一组由语法定义的语言;WF编程模型的核心概念是活动(Activity);WF运行时(WF Runtime)是一个元运行时;建立在通用语言运行时(CLR)之上的;管理着WF程序的执行;WF可以处理的方案包括:在业务线应用程序中启用工作流;用户界面页
2、流;以文档为中心的工作流;人工工作流、系统管理的工作流;面向服务应用程序的复合工作流;业务规则驱动的工作流;,Agenda,概览WF简介设计目标WF Services架构活动(Activity)服务(Service)Demo(烧水器状态机工作流开发),设计目标,初衷:使程序的异步调用更加容易;使分布式模型与逻辑单元的通讯更加灵活;易于变更;给客户提供更严谨的商务控制策略和流程;实现目标:基于Window平台的为微软产品及相关应用程序提供通用的工作流设计平台和开发工具;可用于跨应用场景:与产品、行业没有关系;卓越的可扩展性:提供了类库,可扩展框架及API;简单、直观的与.net开发融为一体的开发
3、环境;是Office12工作流引擎的基础部分;,Agenda,概览WF简介设计目标WF Services架构活动(Activity)服务(Service)Demo(烧水器状态机工作流开发),WF Services架构,核心概念:Workflow是一组Activities;Workflow在一个宿主应用程序中运行:任意应用程序或服务;开发人员可以创建自己的Activity库;组件:Base Activity Library:内置的基本的Activity;Runtime Engine:运行Workflow与状态管理;Runtime Services:宿主Workflow与通讯;Visual Des
4、igner:控件,可以在应用程序中调用设计器;,Agenda,概览WF简介设计目标WF Services架构活动(Activity)服务(Service)Demo(烧水器状态机工作流开发),活动(Activity),工作流模型:一个行为便是一个类;包含了一系列的属性,方法和事件;复合行为管理子行为集;工作流即是一个特殊的复合行为;工作流和行为可以被工作流模型的API定义;Activity:Workflow的基本元素;可以是原子化的任务;也可以是组合了多个activity的节点;可以被动态添加到用XML DOM表示的节点中;如果一个workflow中的路径上的所有Activity都运行完毕,该w
5、orkflow就完成了;,Agenda,概览WF简介设计目标WF Services架构活动(Activity)服务(Service)Demo(烧水器状态机工作流开发),服务(Service),WF运行时是一个服务的容器:AddService();Getservice();RemoveService();用于管理工作流实例的公共核心服务:WorkflowLoaderService;CreateWorkflow(typeof(BoilerWorkflow);CreateWorkflow(XmlTextReader.Create(“Workflow.xml);WorkflowSchedulerSer
6、vice;WF运行时从不自己创建线程,它利用此运行时服务来获取运行WF程序实例所需的线程;WorkflowPersistenceService;钝化服务默认是没有加载的,可以使用现成的SqlPersistenceService,也可以基服务类派生可以创建自定义服务;,服务(Service),用于管理工作流实例的公共核心服务:允许工作流长期保持活动状态并在应用程序重新启动之后存在;TrackingService(是一项功能);用于指定并捕获有关工作流实例的信息,并在这些实例执行时存储该信息;现成的SqlTrackingService,该跟踪服务可以跟踪三种类型的事件:工作流实例事件、活动事件和用
7、户事件;,在工作流中使用本地服务,工作流通信服务Windows Workflow Foundation 工作流通信服务实现一种供对象与工作流实例通信的简单机制。通信通道的定义是一个接口,其实现是添加到运行时以方便通信的服务类;对于服务类,工作流的行为很像任何其他类,您通过引发事件和接收方法调用与其通信。对于工作流,通信接口显示为包含入站事件接收和出站操作方法调用的通道;ExternalDataExchangeService 将接口上的外部方法声明转换为服务对象上的方法调用。我们可以视为本地服务的类能够引发事件,工作流运行时引擎截获这些事件并将其作为工作流的入站消息加以传送。,Agenda,概览
8、WF简介设计目标WF Services架构活动(Activity)服务(Service)Demo(烧水器状态机工作流开发),Demo(烧水器工作流开发),状态机工作流的开发;工作流实例和外界的通信;工作流实例的承载(hosting);工作流实例的持久化与状态管理。,Demo(烧水器工作流开发),状态机工作流 描述烧水器的状态不外乎就两个:空闲状态和工作状态。刚买回来的时候,它的状态是空闲的,自第一个用户开始,它就不断地在两个状态之间切换:工作状态、空闲状态、工作状态、空闲状态 直到它因为老化或者损坏而不能工作为止;创建状态机工作流库定义及组织工作流活动;定义通讯服务接口;创建通讯服务实现类;创
9、建宿主应用程序项目初始化工作流运行时并启动;触发“烧水请求”事件;订阅“烧水服务空闲”通知事件;,一、为烧水器创建状态机工作流库:,1、烧水器的状态机工作流设计:,BoilerIdleState:被设为初始状态(Initial State)。或许你已经发现了,这个状态机没有完成状态(Completed State),正如烧水器自买回来的那一刻起就不会有所谓的用完,一般所说的用完只是空闲的一个别称,只要烧水器还能使用,我们就会一直用下去,同样的道理,烧水器状态机模拟了这个过程,这就是为什么它没有完成状态。当烧水器处于空闲状态时,它实际上是在等别人来用,用行话说,就是监听外部的请求事件,于是,我们
10、需要在StartBoiling里添加一个HandleExternalEventActivity,并命名为HandleBoilerRequest:,至此,我们已经勾画出Proton的核心逻辑了,然而,或者你已经注意到了,HandleBoilerRequest和NotifyBoilerIdle的右上角都有一个红色的叹号,它的出现意味着这些活动缺少一些必要的设置。,当烧水器接到后,它就会开始工作,假如为保护烧水器使用完毕延迟10秒关机,DelayActivity是最合适不过了,而10秒后的给外部调用者通知“我已空闲,可以接收新的请求”,CallExternalMetodActivity就可以干这个。
11、在BoilerWorkingState里添加DelayActivity和CallExternalMethodActivity,并分别命名为delayOff和notifyBoilerIdled。,Demo(烧水器工作流开发),状态机工作流的开发;,我们在烧水器工作流里定义了两个状态:当烧水器接到用户请求时,它会从空闲状态转到工作状态;而当烧水器从工作状态转到空闲状态时,它会向用户发出通知。在这两个状态转换的过程里,烧水器工作流和用户发生了交互,那么,这些交互是如何做到的呢?答案是Windows Workflow Foundation提供的本地通讯服务(Local Communication Se
12、rvices),它使得工作流实例和宿主应用程序之间的交互成为可能。之前我们分别在StartBoiling和FinishBoiling里放置的handleBoilerRequest和notifyBoilerIdled就是为此而做的准备。要使这两个世界连接起来,我们还需要定义一个充当“通讯标准”的接口,这个接口必须打上ExternalDataExchangeAttribute,接口定义的方法可以关联到CallExternalMetodActivity,而事件则可以关联到HandleExternalEventActivity(值得提醒的是,充当事件数据的类必须继承自ExternalDataEvent
13、Args类,并打上SerializableAttribute)。下面是IBoilerService接口的定义:,2、烧水器服务设计:,ExternalDataExchange public interface IBoilerService void NotifyBoilerIdled(Guid instanceId,string userId);event EventHandler BoilerRequested;,实现类BoilerService(必须打上SerializableAttribute),定义的NotifyBoilerIdled方法和BoilerRequest事件是给烧水器工作流
14、使用的,而BoilerIdled事件和NotifyBoilerRequest方法则是给宿主应用程序使用的。,Serializable public class BoilerService:IBoilerService public event EventHandler BoilerIdled;public void NotifyBoilerIdled(Guid instanceId,string userId)if(BoilerIdled!=null)BoilerIdledEventArgs e=new BoilerIdledEventArgs(instanceId,userId);BoilerIdled(null,e);public event EventHandler BoilerRequested;public void RaiseBoilerRequestedEvent(Guid instanceId,string userId)if(BoilerRequested!=null)BoilerEventArgs e=new BoilerEventArgs(in
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1