gpt4 book ai didi

c# - 如何在(重新托管的)工作流设计器中将工作流与旧版本的事件库一起使用?

转载 作者:太空宇宙 更新时间:2023-11-03 14:33:16 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

现在我很乐意展示来自不同版本事件库的图表,没有任何问题;)

关于c# - 如何在(重新托管的)工作流设计器中将工作流与旧版本的事件库一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2094487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com