大家都知道MOSS里用SharePoint Designer 设计的工作流,不能很方便的被重用。原因在于当设计好工作流后,被附上工作流的文档库ID,工作流文档库(Workflows)ID,工作流历史列表(Wokflow History)ID已经被硬编码到相应的文件里。如果工作流里有任务Activity参与,那么任务列表(Tasks)的ID和相应的工作流任务内容类型的ID也被记录到相应的文件里。因此工作流不能被直接复用。如果真要复用已经设计好的工作流,我觉得以下步骤是一个可行的解决方案
1. 设计好工作流,并确认当前工作流工作正确(一般都会有一个现有的工作流要部署到其他站点,否者也不会有这么个解决方案)。
2. 如果当前工作流涉及到了任务列表,并在任务列表中创建了内容类型,通常是使用了Collect Data From User Activity。我们要将这些生成的内容类型打包成一个Site范围的Feature。推荐使用一个内容类型导出专用工具:CTExplorer。此工具似乎只能针对单个内容类型进行导出,不过没关系,我们可以把多个内容类型内容重新拷贝粘贴到同一个Feature中。这个Feature需要首先被激活应用到Site中,因为后一个Feature需要使用这些内容类型。
3. 使用VseWss自带的SharePoint Solution Generator将当前站点导出,其目的是我们可以方便得获取相关的工作流文件,将这些工作流(至少一个)打到第二个Feature中,其目录结构如图所示:
现在需要做的工作是,在每个工作流文件夹中添加两个文件,一个文件是ExportedListInformation.xml,记录的是当前工作流使用过的文档库和辅助列表的Title, ID和Description。Title(当然两个站点当中用到的文档库和辅助列表要一样,Title和列信息)和ID尤为重要。因为代码要通过Title找到新站点的文档库和列表,然后再替换相关的ID。其格式如图所示:
还有一个文件是WorkflowTaskListContentTypes.xml,这个文件记录的是当前工作流中使用到的任务内容类型ID,注意其中的Name节点内容不很重要,主要是为了提高可读性。如果没有产生新的任务内容类型,我们可以留空,但是需要有一个文件在里边放着,其格式如下:
4. 在附加工作流文件的Feature中用上Feature Receiver,注意, 我们要将当前工作流所附属的文档库以及辅助列表在当前的Receiver中生成(建议用代码方式在新站点生成文档库和列表)。同时这个Receiver里,负责将工作流文件添加到新的站点,将任务内容类型加到任务列表中并获取新的文档库和列表的ID,以及任务列表中内容类型新的ID, 通过已经配置好的两个xml文件进行替换。
5. 以上提到一共有两个Feature,第一个用来创建站点集(Site)级别的内容类型,第二个是站点(Web)级别的,用来添加工作流文件,替换ID,并将工作流绑定到目标文档库上。因此第一个Feature需要首先激活,我们可以用ActivationDependency,将第二个Feature的关联Feature设为第一个Feature的ID。
6. 当Feature全部激活后,我们还是要做些手工处理的,有些工作流变量例如string类型的里边可能包括url硬编码,以及人员类型的变量可能所在的域不同,还是要用SharePoint Designer进行修改的。最后做一下测试
内容类型导出工具CTExplorer和示例代码从这里下载,希望能对大家带来些帮助。
提示:在SharePoint 2010中用Designer已经可以设计出可重用的工作流,这里有一个用SharePoint Designer 2010设计可重用工作流的视频。
![](/images/cnblogs_com/happyhzs2000/qsygsl.jpg)