Рабочий процесс Windows - ветвь IfElse
-
06-07-2019 - |
Вопрос
Я пытаюсь использовать Windows Workflow и у меня есть модель, похожая на изображение в ссылке ниже:
После каждой из операций отправки ( Хотя на этой картинке в моей реальной модели это может показаться не так уж и плохо, пользовательская операция представляет собой SequenceActivty, имеет довольно много узлов, и при повторении 3 раза рабочий процесс выглядит очень некрасиво. Я хотел бы сделать что-то вроде этого: Можно ли объединить ветви GetSomthing
, GetSomthingElse
, GetSomeMoreStuff
) вызывается одно и то же настраиваемое действие ( LogSomthingBadHappened код>). Р>
р>
IfElse
следующим образом?
Должен ли я вместо этого использовать рабочий процесс конечного автомата (еще не выяснил это)?
Решение
Используйте FaultHandler в рабочем процессе и сгенерируйте определенный тип исключения, который обработчик отлавливает. Не самая изящная, но я думаю, что это должно работать.
Другие советы
В последовательных рабочих процессах все шаги должны отображаться в определенном порядке, а путь выполнения регулируется исключительно структурами управления (IF, WHILE).
Изменение пути выполнения способом, который вы описываете, будет аналогично использованию оператора GOTO в императивном коде, который, как мы знаем, приводит к ненужной сложности.
Если действия, содержащиеся в SequenceActivity , которые необходимо выполнить на разных этапах рабочего процесса, в точности совпадают, вы можете встроить их в настраиваемое действие . Таким образом, ими легче управлять, поскольку они содержатся в одной логической единице.
В императивном коде это будет похоже на рефакторинг части дублированного кода в метод, который затем вызывается в нескольких местах.
Еще одна альтернатива, которая может сработать, - это поместить действие LogSomthingBadHappened в настраиваемый рабочий процесс и включать его несколько раз. Несколько вещей, на которые следует обратить внимание: рабочий процесс выполняется асинхронно , если для действия LogSomthingBadHappened требуется информация о состоянии из основного рабочего процесса, копирование в вспомогательный рабочий процесс может быть затруднено.
Я не пробовал этого, так что это может даже не сработать.
Я думаю, что ответ от gbanfill указывает на правильное направление.
Обобщая, я определяю проблему следующим образом:
Есть ли способ определить группу действий, которые будут выполняться в нескольких местах рабочего процесса?
Дополнительные требования:
Возможно, способ сделать это - определить подпроцессы и создать настраиваемое действие, которое будет создавать экземпляр подпроцесса и ждать его завершения, прежде чем продолжить. Р>
У этого пользовательского действия должно быть как минимум два параметра: идентификатор под-процесса и входные параметры.