2010-01-19 5 views
2

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

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

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

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

ответ

1

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

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

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

+0

«показывающих диаграммами различных версий», вы используете asp.net? какую библиотеку диаграмм вы используете? –

+0

Да, asp.net и реорганизованный стандартный конструктор WF .. он основан на этом образце Atlas Workflow Monitor, см. Ссылку выше;) –

Смежные вопросы