1. 背景
公司的业务流程往往不是一层不变的,随着业务规模的扩大,或者业务流程的改善,系统支持的工作流也需要进行相应的调整。基于SharePoint开发的工作流也需要考虑到工作流可能在一定时期需要变更的需求。让我们想象一下这样一个场景:你通过Visual Studio开发了一个支持二级顺序审批工作流,并将其发布到生产环境。工作流运行正常,每天有几十个实例同时运行。然而,几个月后,公司的管理层告诉你,我们需要将审批工作流从二级审批扩展至三级,增加了总经理审批。你回到原来的代码,增加少量的逻辑来实施新增的需求,测试编译成后,发布到生产环境。但是,让你吃惊的是,所有的新工作流启实例启动失败,并且,原有的几十个运行中的实例,也无法正常完成。原因在于,你没有版本化你的工作流代码。
2. SharePoint版本化工作流的原理
工作流版本化是非常重要的技术。SharePoint工作流的状态是保存在数据据当中的,这种状态的保存称之为持久化。当工作流发生状态的变化时,持久状态会从数据库中脱离并动态地运行下去。工作流的版本化之所以重要的原因在于,工作流数据被持久化的保留于数据库当中,如果的相应的工作流组件被更改了,那么系统将无法保证原有的工作流持久化信息是否会指向新的被更改后的组件。如果指向新的组件后,且反序列化过程中发生了组件结构不匹配时,工作流实例执行会出现失败。对于工作流代码的修改如增删活动、属性修改等都需要版本化工作流,好的做法就是对每个编译版本都赋于增加的版本号,而不一直停留在1.0版本。而后,针对每一次的工作流升级,为新版本创建一个新的SharePoint功能(Feature),新的功能将指向新版本的工作流组件。新旧版本的工作流组件将同时存在于GAC(Global assemble cache)。最后,在SharePoint列表中,禁止旧版本工作流模板启动新的实例,并将新版本工作流模板绑定到列表当中。通过这种方法将确保原有工作流实例在脱离数据库过程中不会出现结构不匹配的现象而导致工作流失败。你将不必删除原有的旧版本的工作流模板,因为当前可能还有其实例正在运行当中。
3. SharePoint版本化工作流指南
如何版本化SharePoint工作流,以下给出具体的操作步骤(该指南基于VS2010的SharePoint2010顺序工作流模板):
基于V1.0工作流,创建V2.0
|
1.在worflow的Elements.xml文件中,将CodeBesideAssembly元素的$assemblyname$强替代为: [assembly name], Version=1.0.0.0, Culture=neutral, PublicKeyToken=[token] 2 将 [assembly name] 替代为工作流组件的名称 3 将 [token] 更改为工作流组件的公共密钥public key token。(在GAC (c:\windows\assembly) 里找到相应的组件,查看其属性,并复制token 4 更改workflow的name属性,使其标识新版本的工作流模板。 NOTE: 这将确保用户清楚当前正在处理的是哪个版本的工作流。 5 定位到解决方案的Package目录,双击Package, 在Avnaced页中,将原有的1.0.0.0版本附加进来。 NOTE: 复制原有的1.0.0.0版本到别外的项目目录下面,旧版本和当前版本组件不能保存在同一目录下面,因为他们的名称是一样的。
|
更新工作流的Elements.xml文件,使其同时参照1.0和2.0版本的工作流组件
|
1 打开工作流项目的Elemets.xml文件 2 复制整个workflow节点,从<workflow>到</workflow>,并粘贴在</workflow>标签后面 3 对复制的workflow节点,修改其工作流名称和CodeBesideAssembly,指向2.0.0.0版本工作流组件 4 新建一个GUID,并将其替代修原有工作流ID, 5 编译并发布解决方案 |
激活V2工作流
|
在网站集功能设置中,重新激活该工作流功能(Deactivate -> Reactivate)
|
V2被布署和激活后,你需要禁止V1被启动新的实例
|
在列表的工作流设置中,修改V1的设置使其无法创建新实例。 |
· 该文章参于<<SharePoint.2010.Workflows.in.Action>>--Phil.Wichlund