Вопрос

Я пытаюсь использовать Windows Workflow и у меня есть модель, похожая на изображение в ссылке ниже:
Снимок экрана рабочего процесса

После каждой из операций отправки ( GetSomthing , GetSomthingElse , GetSomeMoreStuff ) вызывается одно и то же настраиваемое действие ( LogSomthingBadHappened ).

Хотя на этой картинке в моей реальной модели это может показаться не так уж и плохо, пользовательская операция представляет собой SequenceActivty, имеет довольно много узлов, и при повторении 3 раза рабочий процесс выглядит очень некрасиво.

Я хотел бы сделать что-то вроде этого:
Снимок экрана измененного рабочего процесса

Можно ли объединить ветви IfElse следующим образом?
Должен ли я вместо этого использовать рабочий процесс конечного автомата (еще не выяснил это)?

Это было полезно?

Решение

Используйте FaultHandler в рабочем процессе и сгенерируйте определенный тип исключения, который обработчик отлавливает. Не самая изящная, но я думаю, что это должно работать.

Другие советы

В последовательных рабочих процессах все шаги должны отображаться в определенном порядке, а путь выполнения регулируется исключительно структурами управления (IF, WHILE).
Изменение пути выполнения способом, который вы описываете, будет аналогично использованию оператора GOTO в императивном коде, который, как мы знаем, приводит к ненужной сложности.

Если действия, содержащиеся в SequenceActivity , которые необходимо выполнить на разных этапах рабочего процесса, в точности совпадают, вы можете встроить их в настраиваемое действие . Таким образом, ими легче управлять, поскольку они содержатся в одной логической единице.
В императивном коде это будет похоже на рефакторинг части дублированного кода в метод, который затем вызывается в нескольких местах.

Еще одна альтернатива, которая может сработать, - это поместить действие LogSomthingBadHappened в настраиваемый рабочий процесс и включать его несколько раз. Несколько вещей, на которые следует обратить внимание: рабочий процесс выполняется асинхронно , если для действия LogSomthingBadHappened требуется информация о состоянии из основного рабочего процесса, копирование в вспомогательный рабочий процесс может быть затруднено.

Я не пробовал этого, так что это может даже не сработать.

Я думаю, что ответ от gbanfill указывает на правильное направление.

Обобщая, я определяю проблему следующим образом:

Есть ли способ определить группу действий, которые будут выполняться в нескольких местах рабочего процесса?
Дополнительные требования:

<Ол>
  • Группа действий должна определяться только в XAML, т.е. без кода.
  • Тип ввода в эту группу, конечно, будет фиксированным, но фактические значения должны зависеть от вызова (например, вызова функции).
  • Возможно, способ сделать это - определить подпроцессы и создать настраиваемое действие, которое будет создавать экземпляр подпроцесса и ждать его завершения, прежде чем продолжить.

    У этого пользовательского действия должно быть как минимум два параметра: идентификатор под-процесса и входные параметры.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top