Как я могу использовать рабочие процессы со старыми версиями библиотек действий в (обновленном) конструкторе рабочих процессов? - PullRequest
2 голосов
/ 19 января 2010

Я использовал перепроектированный дизайнер рабочих процессов в приложении ASP.NET для генерации изображений рабочих процессов, в основном применяя образец WorkflowMonitor аналогично Atlas Workflow Monitor . Теперь я начал беспокоиться о поведении этого решения после повторного развертывания, когда установленная версия библиотек больше не соответствует исходной из старых определений рабочих процессов (особенно из отслеживаемых рабочих процессов и записей истории в базе данных, которая содержит XOML рабочих процессов, которые были выполнено в прошлом). Стоит отметить, что я прочитал статью об одновременном использовании нескольких версий рабочих процессов, и это не совсем то, что мне нужно, поскольку я действительно не хочу запускать рабочие процессы со старыми определениями, Я просто хочу показать свои диаграммы. Я видел только 2 решения:

  1. Сделайте снимок экрана у дизайнера рабочего процесса в тот момент, когда рабочий процесс завершится / завершится, где у меня еще есть актуальная версия библиотек, и просто сохраните его как растровое изображение в базе данных.
  2. Храните старые версии библиотек в отдельной папке, чтобы можно было каким-то образом загрузить их в конструктор, чтобы он все еще мог генерировать диаграммы из старых рабочих процессов, даже если в них больше нет действий в текущей версии сборки.

Поскольку я хотел избежать напрасной траты места (решение 1), я решил сначала попробовать решение 2. Я нашел несколько примеров использования службы TypeProvider для WorkflowMarkupSerializer или WorkflowDesignSurface и попытался использовать их. К сожалению, в сценарии, где действие удаляется в новой библиотеке, а старая библиотека загружается с этим TypeProvider, похоже, не работает, в случае непосредственного использования WorkflowMarkupSerializer для чтения XOML просто исключает отсутствующую активность из диаграммы при использовании SqlTrackingService для загрузки некоторых старых отслеживаемых экземпляров выдается исключение, из-за которого отсутствует тип действия (хотя внутренне, похоже, используется тот же метод WorkflowMarkupSerializer).

У вас есть какой-то опыт или советы, как следует использовать TypeProvider, что может пойти не так? Спасибо;)

1 Ответ

1 голос
/ 21 января 2010

Оказалось, что TypeProviders не являются надежным способом разрешения ссылок на сборки, которые отсутствуют для рендеринга рабочего процесса (и доступа к информации отслеживания для старых действий и т. Д.). Проблема заключается не только в том, что они не работают для SqlTrackingService, но и в том, что для того, чтобы иметь возможность передавать сборку в TypeProvider, она должна быть загружена в домен приложений. Наличие нескольких версий одной и той же сборки в AppDomain приводит к невероятным вещам, поэтому было абсолютно необходимо избегать этого.

Несмотря на то, что невозможно выгрузить сборку из AppDomain после его загрузки, можно создать изолированный AppDomain, который при необходимости загружает более старую версию сборок (я сделал это, зарегистрировавшись в событии AssemblyResolve объекта AppDomain), а затем просто выгрузите весь AppDomain, когда работа будет завершена. Пример того, как это можно сделать, приведен в соответствующем вопросе .

Теперь я без проблем показываю диаграммы из разных версий библиотек деятельности;)

...