2010-01-19 79 views
2

我在ASP.NET应用程序中使用了重新主办的工作流设计器来生成工作流图像,基本上采用了类似于Atlas Workflow Monitor的WorkflowMonitor示例。现在我已经开始担心重新部署后该解决方案的行为,因为已安装版本的库不再与旧工作流定义中的原始版本匹配(尤其是来自数据库中的跟踪工作流和历史记录条目,其中包含工作流的XOML过去执行)。值得注意的一件事是我已阅读article关于同时使用多个版本的工作流程,这不完全是我所需要的,因为我不想用旧定义来运行工作流程,我只想显示它们图。我看到只有2解决方案:如何在(rehosted)工作流设计器中使用旧版活动库的工作流程?

  1. 采取从工作流设计器的截图在当工作流完成/终止,在那里我仍然有库的实际版本,并简单地将其保存为位图到数据库的时间。
  2. 将旧版本的库保存在一个单独的文件夹中,只是为了能够以某种方式将它们加载到设计器中,以便即使它们中的活动不再位于当前程序集版本中,它仍然可以从旧工作流生成图。

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

您是否有这方面的经验或提示如何使用TypeProvider可能会出错?谢谢;)

回答

1

事实证明TypeProviders不是一种可靠的方式来解决工作流程渲染时丢失的程序集引用(以及访问旧活动的跟踪信息等)。问题不仅在于它们不适用于SqlTrackingService,而且为了能够将程序集传递给TypeProvider,它必须加载到AppDomain中。在AppDomain中有相同程序集的多个版本会导致疯狂的事情发生,所以完全有必要避免它。

虽然是不可能的,一旦它被装载到从一个AppDomain卸载的组件,可能需要(当我做这个注册到的AssemblyResolve事件来创建它加载组件的旧版本,一个孤立的AppDomain AppDomain),然后在工作完成时简单地卸载整个AppDomain。例如,如何做到这一点,请参阅相关question

现在,我愉快地显示来自不同版本的活性库图没有任何问题;)

+0

“不同版本的显示图”,您使用asp.net?你使用什么图表库? – 2010-01-21 10:32:53

+0

是的,asp.net和一个重新托管的标准WF设计器..它基于这个Atlas Workflow Monitor示例,请参阅上面的链接;) – 2010-01-21 10:59:12