【问题标题】:How can I use workflows with older versions of activity libraries in (rehosted) workflow designer?如何在(重新托管的)工作流设计器中将工作流与旧版本的活动库一起使用?
【发布时间】:2010-01-19 15:17:17
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# .net workflow-foundation versioning


    【解决方案1】:

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

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

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

    【讨论】:

    • "显示不同版本的图表",您使用的是 asp.net 吗?你用什么图表库?
    • 是的,asp.net 和一个重新托管的标准 WF 设计器。它基于此 Atlas Workflow Monitor 示例,请参见上面的链接;)
    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多