簡體   English   中英

如何在(重新托管的)工作流設計器中將工作流與舊版本的活動庫一起使用?

[英]How can I use workflows with older versions of activity libraries in (rehosted) workflow designer?

我在ASP.NET應用程序中使用了重新托管的工作流設計器來生成工作流的圖像,基本上采用了類似於Atlas Workflow Monitor之類的WorkflowMonitor示例。 現在,當庫的已安裝版本不再與舊工作流程定義中的原始版本匹配時(尤其是從包含以下內容的工作流程的XOML的數據庫中跟蹤的工作流程和歷史記錄條目開始),我開始擔心重新部署此解決方案后的行為:過去執行)。 值得注意的一件事是,我已經閱讀了有關同時使用多個版本的工作流的文章 ,而這並不是我真正需要的,因為我真的不想運行帶有舊定義的工作流,我只想顯示它們的圖。 我只看到兩種解決方案:

  1. 在工作流完成/終止時從工作流設計器中截取屏幕截圖,在那里我仍然擁有庫的實際版本,只需將其作為位圖保存到數據庫中即可。
  2. 將舊版本的庫保存在單獨的文件夾中,只是為了能夠以某種方式將它們加載到設計器中,以便即使舊工作流中的活動不再在當前程序集版本中,它仍可以從舊工作流生成圖表。

為了避免浪費空間(解決方案1),我決定首先嘗試解決方案2。我發現了一些將TypeProvider服務用於WorkflowMarkupSerializer或WorkflowDesignSurface的示例,並嘗試使用它們。 不幸的是,在一個活動在較新的庫中被刪除並且舊的庫已使用此TypeProvider加載的情況下,它似乎不起作用,如果直接使用WorkflowMarkupSerializer來讀取XOML,它只是從圖中排除了缺少的活動,當使用SqlTrackingService加載一些舊的跟蹤實例時,它會拋出一個異常,即缺少活動類型(盡管在內部它似乎使用了WorkflowMarkupSerializer的相同方法)。

您是否對此有一些經驗,或者提示如何使用TypeProvider可能會出錯? 謝謝 ;)

事實證明,TypeProviders不是解決工作流呈現中缺少的程序集引用(以及訪問舊活動等的跟蹤信息)的可靠方法。 問題不僅在於它們不適用於SqlTrackingService,而且還在於要能夠將程序集傳遞給TypeProvider,必須將其加載到AppDomain中。 AppDomain中具有相同程序集的多個版本會導致瘋狂的事情發生,因此絕對有必要避免這種情況。

盡管無法從AppDomain中卸載程序集,但可以創建一個隔離的AppDomain,以便在必要時加載較早版本的程序集(我已經完成了向AppDomain的AssemblyResolve事件的注冊),並且然后在工作完成后直接卸載整個AppDomain。 有關如何完成此操作的示例,請參閱相關問題

現在,我很高興地展示了來自不同版本的活動庫的圖表,沒有任何問題;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM