我在ASP.NET应用程序中使用了重新托管的工作流设计器来生成工作流的图像,基本上采用与Atlas Workflow Monitor类似的方式采用WorkflowMonitor示例。现在,我已经开始担心重新部署后此解决方案的行为,因为已安装的库版本不再与旧工作流定义中的原始版本匹配(特别是来自包含工作流的XOML的数据库中的跟踪工作流和历史条目)在过去执行)。值得注意的一点是,我已经阅读了article关于同时使用多个版本的工作流的问题,这并不是我所需要的,因为我真的不想用旧定义来运行工作流,我只是想要展示他们的图表。我只看到了两个解决方案:
由于我想避免浪费空间(解决方案1),我决定首先尝试解决方案2.我找到了一些使用TypeProvider服务的示例,用于WorkflowMarkupSerializer或WorkflowDesignSurface并尝试使用它们。不幸的是,在更新的库中删除活动并且使用此TypeProvider加载旧库的情况下,似乎不起作用,如果直接使用WorkflowMarkupSerializer读取XOML,它只是从图中排除了缺少的活动,当使用SqlTrackingService加载一些旧的跟踪实例时,它会抛出一个异常,即缺少活动的类型(尽管内部似乎使用了与WorkflowMarkupSerializer相同的方法)。
您是否对此有一些经验或提示如何使用TypeProvider可能出错?谢谢;)
答案 0 :(得分:1)
事实证明,TypeProviders不是解析工作流呈现缺失的程序集引用(以及访问旧活动的跟踪信息等)的可靠方法。问题不仅在于它们不适用于SqlTrackingService,而且还能够将程序集传递给TypeProvider,它必须加载到AppDomain中。在AppDomain中拥有相同程序集的多个版本会导致疯狂的事情发生,因此绝对有必要避免它。
虽然在加载后无法从AppDomain卸载程序集,但可以创建一个隔离的AppDomain,在必要时加载旧版本的程序集(我已经注册到了AssemblyResolve事件中) AppDomain)然后在工作完成后简单地卸载整个AppDomain。例如,如何做到这一点,请参阅相关的question。
现在,我很高兴地显示来自不同版本的活动库的图表,没有任何问题;)