代码之家  ›  专栏  ›  技术社区  ›  Tomas Vana

如何在工作流设计器中使用具有旧版本活动库的工作流?

  •  2
  • Tomas Vana  · 技术社区  · 15 年前

    我在ASP.NET应用程序中使用了重新承载的工作流设计器来生成工作流的图像,基本上采用了与 Atlas Workflow Monitor . 现在,我开始担心重新部署后,当库的安装版本不再与旧工作流定义中的原始版本匹配时(尤其是从包含以前执行的工作流的XOML的数据库中的跟踪工作流和历史记录条目中),此解决方案的行为。值得注意的一点是,我已经阅读了 article 关于同时使用多个版本的工作流,这并不是我真正需要的,因为我不想使用旧定义运行工作流,我只想显示它们的图表。我只看到两个解决方案:

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

    由于我想避免浪费空间(解决方案1),我决定首先尝试解决方案2。我发现了一些使用WorkflowMarkupSerializer或WorkflowDesignSurface的TypeProvider服务的示例,并尝试使用它们。不幸的是,如果在新库中删除了某个活动,而旧库中加载了此类型提供程序,那么在直接使用WorkflowMarkupSerializer来读取XOML的情况下,它只会从关系图中排除丢失的活动,而在使用sqlTrackingService加载它抛出的某些旧跟踪实例时是缺少活动类型的异常(尽管在内部它似乎使用了与WorkflowMarkupSerializer相同的方法)。

    您是否有过这样的经验或提示:应该如何使用类型提供者?哪些地方可能出错?谢谢;

    1 回复  |  直到 15 年前
        1
  •  1
  •   Community Tales Farias    7 年前

    结果表明,类型提供程序不是解决工作流呈现缺少的程序集引用(以及访问旧活动的跟踪信息等)的可靠方法。问题不仅在于它们不适用于sqltrackingservice,而且为了能够将程序集传递给typeprovider,必须将程序集加载到appdomain中。在AppDomain中拥有同一程序集的多个版本会导致疯狂的事情发生,因此绝对有必要避免这种情况。

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

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