代码改变世界

使用VS进行工作流开发系列博客2-Developing Workflows in VS: Part 1 - Workflow Objects and A Crash Course on Mechanics

2008-11-24 13:39  Virus-BeautyCode  阅读(1626)  评论(0编辑  收藏  举报


原文地址:
http://blogs.msdn.com/sharepoint/archive/2006/11/18/developing-workflows-in-vs-part-1-workflow-objects-and-a-crash-course-on-mechanics.aspx

The Workflow Objects
工作流对象
Workflow Template vs. Association vs. Instance
工作流模板vs关联vs工作流实例
在工作流中有一些术语经常被混淆:模板,关联,实例。如果你没有从本系列中读过任何内容的话,确保你理解这几个部分。保持这些术语的联系性是理解其他文档和SharePoint工作流内容的关键。
首先我们讲一下模板。模板是SharePoint工作流的一个功能,它被发布到一个网站集中。(feature功能,是SharePoint的自定义部分中的一个,例如webpart、内容类型等)模板基本上就是说“hi,这个工作流功能使用这些表单和这个程序集”。它只是作为一个框架存储在网站集的中心仓库中,网站集的任何列表或者内容类型都可以使用它。
但是,这个模板只能看,一个列表不能直接使用模板。工作路是自己开始吗?工作流任务应该存储在那里呢?我们需要一个额外的层次来自定义模板来使用这些信息。这就引出了关联。关联一个模板和列表,我们创建一个关联。一个关联为模板存储一些自定义的信息,并且将模板和一个列表或者内容类型绑定。这些自定义的信息包括关联的标题,什么时候启动工作流模板(例如,手动还是自动),和自定义工作流的设置项,比如说工作流的默认审批人。理解这里的一个重要的事情是一个列表或者内容类型可以和同一个模板有多个关联。例如,你有报销审批和发布审批这两个关联,他们都和审批工作流模板绑定,每个自定义关联都有他们自己的设置和默认值;他们只是名称不同。
当我们实际启动一个工作流,我们是创建了一个关联的工作流实例(而不是一个模板的工作流实例)。每一个列表项每次可以启动特定关联的一个实例。因此,只能有一个报销审批的实例运行在一条列表项上,和一个发布审批工作流的实例。但是都是建立在审批工作流模板之上的。
因此你用VS开发的工作流是一个工作流的模板,定义了通用的功能。工作流模板描述的关联表单记录了自定义的关联数据来创建一个关联。初始化表单从关联收集数据来创建一个新的工作流实例,使用这个关联数据装载初始值。
Tasks, History Items, and Modifications
工作流任务,工作流历史记录和修改
另一个重要的SharePoint工作流详细内容是工作流任务,工作流历史记录,工作流的修改。
一旦一个工作流开始启动,它可以调用任何SharePoint对象模型代码。因为SharePoint工作流集中在以人为基础的处理上,而不是完全靠程序的自动化步骤上,工作路的启动就是在SharePoint的任务列表中创建一个任务,创建使用关联中的详细信息。工作流任务就像正常的SharePoint任务列表项一样,但是他们也可以连接到创建他们的工作流,还可以在他们改变或者删除的时候通知他们的父工作流,以便工作流可以采取正确的行为。用户可以使用任务表单(同样在模板中指定)编辑工作流任务,同时工作流可以处理这些编辑项和标记任务的完成。工作流历史记录可以清晰的记录工作流执行的历史过程。历史记录列表和普通列表一样,有一些关于工作流数据的特定列,例如,工作流实例ID,关联ID等。根据实例ID来过滤之后,这些工作流实例的特定列可以在工作流状态页面显示。
但是在工作流的运行过程中,工作流的默写内容可能会被修改,例如,需要添加新的审批人,一个约会的日期需要修改,或者是工作流的一个参数,比如说一个报销审批的最大额度,而不管这个审批经理是否已经批准,这个参数都应该减少。允许用户在工作流的运行过程中和工作流进行交互或者改变工作流参数,这就叫做工作流的修改。修改对象代表一个和工作流交互的渠道,一但工作流是醒着的,不管开发者修改了什么他都应该有有反应。通常来说,如果你需要和正在运行当中的工作流进行交互,应该使用工作流修改,不要想使用任务。
理解这些SharePoint工作流中的基础概念,将会在你创建工作流的时候帮助你理解如何将这些点串起来。总之,下面是上面的概念在工作流的生命周期当中的一个应用。
1、 开发者开发工作流模板
2、 服务器管理员将模板部署到站点集中
3、 列表管理员关联一个工作流模板和站点集中的一个列表或者内容类型,创建一个关联
4、 用户在一个列表项上启动一个工作流关联的实例(或者由事件自动启动一个工作流实例)
5、 执行工作流,根据关联中的描述,在任务列表创建任务,在工作流历史记录中添加历史记录
6、 工作流的所有者(启动工作流的人)或者列表的管理员通过工作流修改,能在任意时间和运行中的工作流交互
David Chappell在MSDN中有一篇关于这个结构的详细描述,如果感兴趣,我非常推荐。
Crash Course on Workflow Mechanics
工作流速成班
对于开发工作流来说,低层次的概念例如工作流如何操作没有什么关键的作用,但是一
些高层次的概念将很有帮助:
1、 当运行中的工作流到达一个节点的时候,也就是他们需要等待一些事情的发生(例如,编辑一个任务),他们被序列化(例如,转化成二进制)并且持久化进入Sharepoint数据库。这个的意思是说工作流对象被转化成一个字符串并且存储到数据库中。我们可以说这个工作流是睡着的。
2、 被持久化的工作流将从内存中消失,不在占用内存
3、 当工作流等待的事件发生,工作流会被反序列化并且激活,然后从他离开的地方继续运行。
典型的sharepoint工作流就是一系列的“运行自定义代码,持久化,反持久化”的周期,持久化和反持久化需要工作流服务的支持。
一个本地的服务是sharepoint和工作流交互的渠道。需要知道的关于他们的一件重要的事情是,他们可以操作工作流项和注册工作流的sharepoint事件,设置工作流为睡觉等待事件,当事件发生激活工作流。
Sharepoint工作流服务的API提供了方法和事件处理。方法代表行为,事件处理将会设置工作流为睡觉或者激活。例如,使用CreateTask创建任务方法将创建一个任务并且为这个任务注册工作流事件。使用OnTaskChanged事件处理映射刚才的任务,工作流将被反持久化。
为了向相同的任务列表映射这些功能,服务将使用相关者(correlators),一种工作流引擎可以使用的,给对象提供映射事件和行为的唯一标识。
在工作流中有详细描述,通过使用相关者tokens和guid(都是必需的)。
关键的事情是要知道你必须使用服务方法(service methods)来使得列表项上的工作流响应事件。另一件事情是,服务方法就是他们的处理行为直到工作流被持久化要提交的批处理行为。这句话的意思是说,如果你使用CreateTask活动,直到工作流成功的被持久化才会创建任务。
容易犯的错误:操作未提交的列表项
不要使用sharepoint对象模型调用那些还没有提交的任务列表或者列表项。要记住首先持久化,使用事件处理或者延迟活动delay,在获取对象之前。例如,如果你使用CreateTask活动,任务的列表项将不存在,直到你使用一个事件处理(例如OnTaskCreated 或者Delay)设置工作流为睡觉。使用其他的工作流服务方法也是可以的,但是在设置工作流睡觉之前不要直接使用列表项的对象模型。