首页 > 代码库 > SharePoint Workflow架构(一)SharePoint 和Workflow Runtime的结合

SharePoint Workflow架构(一)SharePoint 和Workflow Runtime的结合

[译者按]Andy Li这篇文章,是我看过的最好的,最透彻的关于SharePoint Workflow架构的文章。通过阅读他的文章,我才清楚的了解了SharePoint Workflow的运作机制,并且在遇到问题的时候,知道如何下手查找问题。因此翻译过来,希望对Workflow的开发人员有帮助。


这篇博客是由Andy Li贡献的,他是SharePoint开发人员支持组的处理疑难问题的工程师。原文地址。这个关于Workflow的系列,是他贡献给社区的,帮助大家更好的理解Workflow运行时的内部机制,以及如何和SharePoint交互。

这篇文章由SPFarmer翻译。


SharePoint Workflow Runtime的结合


下面的图表描述了SharePoint Workflow的几个大块的组成部分。首先我来概要的解释一下数据流,然后在后面的几个章节,我会详细的介绍每一个部分。

技术分享

首先想一下你是如何启动一个workflow的。

这个部分说的是上面图表中,左边部分蓝色箭头指向的模块。

1. 首先你在List或者Libraryworkflow页面,点击关联到这个list或者libraryworkflow。然后你被重定向到workflow初始表单(Initiation Form,如果你这个workflow有初始表单的话)


2. 提交完初始表单之后( Initiation Form),消息被发到了SPWorkflowManager SPWorkflowManager 是在SharePointObject Model里,你唯一可以用来启动一个workflow示例的对象。


3. SPWorkflowManager 然后通知SharePoint workflow runtimeobject (SPWinOeHostService)需要启动一个workflow实例.


4. SPWinOeHostService 的功能是通知Windows Workflow Runtime来真正启动workflow实例这个是通过先调用System.Workflow.WorkflowRuntime.CreateWorkflow() ,然后再调用System.Workflow.WorkflowInstance.Start().来实现的。

另外一个很常见的场景就是提交一个workflow task

很多人很难理解task的数据是如何被传达到workflow实例的。这个实际上是SharePointWorkflow最复杂的地方,因为这个涉及到WorkflowruntimeSharePoint的很多模块。我先概括的解释数据流,然后在后面的几篇blog里解释细节。

1. 这个流程从你打开一个workflow task的表单时开始。


2. 如果你有一个自定义的task表单,通常你会调用SPWorkflowTask.AlterTask() 来提交对这个task做的改动。这个API再调用SPListItem.Update() 来提交改动.如果你没有自定义的task表单,那么OOBSharePoint task 在本质上做的是同样的事情.


3. 把数据从task传给worokflow的机制,是通过eventreceivers.实现的,你可能已经想到了。是的,这个就是task数据如何被传递给workflow我会解释event receivers 是如何被注册到tasks上的.现在你是需要知道,每一个workflowtask都有一个eventreceiverhook在上面。目的是把task的改变,传给对应的workflow实例。


4. Event receiver 调用SPWorkflowManager (是的,它是唯一能够调用workflowruntimeobject)private方法SPWorkflowManager.RunWorkflow()也就是说,作为一个开发人员,你只能调用SPWorkflowTask.AlterTask() 或者 SPListItem.Update() 来出发这个动作。


注意: SharePoint 2010引入了一个新的概念叫PluggableService,来实现workflow能够和任何外部服务交互,比如自定义WCFservice,等等.SharePoint2007里,这个是不可能的,在SharePoint2007里,只能通过SharePointTask俩和workflow通信.在图表里,SPWorkflowExternalDataExchangeService 被用来传递自定义事件给workflow.本质上,这个和传递task的改动到workflow是一样的,因此这里我们使用自带的task来解释其他事情。

5. 然后SPWorkflowManager 把数据传递给SharePointworkflow runtime,然后要找出这个数据应该往下传给谁。例如,这是一个task,还是一个正常的item.基于数据的类型,对应的dataexchange service 会继续传递数据。


6. 所有的data exchange services即使基于 Workflow Communication Services.SharePoint里面,Microsoft.SharePoint.Workflow.ITaskService 是在workflowSharePoint之间交换数据的接口。后面我们会讨论更多。

SharePoint Workflow架构(一)SharePoint 和Workflow Runtime的结合