如何在(重新托管)工作流设计器中使用旧版本活动库的工作流程?

时间:2010-01-19 15:17:17

标签: c# .net workflow-foundation versioning

我在ASP.NET应用程序中使用了重新托管的工作流设计器来生成工作流的图像,基本上采用与Atlas Workflow Monitor类似的方式采用WorkflowMonitor示例。现在,我已经开始担心重新部署后此解决方案的行为,因为已安装的库版本不再与旧工作流定义中的原始版本匹配(特别是来自包含工作流的XOML的数据库中的跟踪工作流和历史条目)在过去执行)。值得注意的一点是,我已经阅读了article关于同时使用多个版本的工作流的问题,这并不是我所需要的,因为我真的不想用旧定义来运行工作流,我只是想要展示他们的图表。我只看到了两个解决方案:

  1. 在工作流程完成/终止时从工作流设计器截取屏幕截图,我仍然拥有库的实际版本,只需将其作为位图保存到数据库中。
  2. 将旧版本的库保存在单独的文件夹中只是为了能够以某种方式将它们加载到设计器中,这样它仍然可以从旧工作流生成图表,即使它们中的活动不再是当前的程序集版本。 / LI>

    由于我想避免浪费空间(解决方案1),我决定首先尝试解决方案2.我找到了一些使用TypeProvider服务的示例,用于WorkflowMarkupSerializer或WorkflowDesignSurface并尝试使用它们。不幸的是,在更新的库中删除活动并且使用此TypeProvider加载旧库的情况下,似乎不起作用,如果直接使用WorkflowMarkupSerializer读取XOML,它只是从图中排除了缺少的活动,当使用SqlTrackingService加载一些旧的跟踪实例时,它会抛出一个异常,即缺少活动的类型(尽管内部似乎使用了与WorkflowMarkupSerializer相同的方法)。

    您是否对此有一些经验或提示如何使用TypeProvider可能出错?谢谢;)

1 个答案:

答案 0 :(得分:1)

事实证明,TypeProviders不是解析工作流呈现缺失的程序集引用(以及访问旧活动的跟踪信息等)的可靠方法。问题不仅在于它们不适用于SqlTrackingService,而且还能够将程序集传递给TypeProvider,它必须加载到AppDomain中。在AppDomain中拥有相同程序集的多个版本会导致疯狂的事情发生,因此绝对有必要避免它。

虽然在加载后无法从AppDomain卸载程序集,但可以创建一个隔离的AppDomain,在必要时加载旧版本的程序集(我已经注册到了AssemblyResolve事件中) AppDomain)然后在工作完成后简单地卸载整个AppDomain。例如,如何做到这一点,请参阅相关的question

现在,我很高兴地显示来自不同版本的活动库的图表,没有任何问题;)