Какой лучший дизайн для веб-приложения, использующего WF?

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

Из-за указанного требования нас попросили также использовать структуру рабочего процесса, чтобы облегчить прозрачность процесса.

В прототипе мы успешно включили рабочий процесс, и он отлично работает. однако мы не можем определить действия, которые должны быть доступны пользователю. Например, у меня есть следующие операторы получения: create(), managerApprove(), RAApprove(), ORMApprove().. теперь, если я их вызову в порядке, используя правильное имя пользователя, тогда они будут работать. Очевидно, если я не буду их приводить по порядку, тогда он выкинет исключение FaultException, потому что оно не в правильном состоянии. Вопрос в том, как я узнаю, какие функции доступны для экспонирования в пользовательском интерфейсе - скажем, если в настоящее время он ждет одобрения менеджера, просто покажите кнопку подтверждения для менеджера...

В качестве обходного пути я создал еще одну службу WCF, которая извлекает те же данные из базы данных и затем определяет правильное состояние пользовательского интерфейса (какие действия могут выполнять пользователь). Я думаю, что это дублирование логики, так как это предполагается в WF уже.

Кроме того, если WF изменяется, то моя отдельная служба WCF может потенциально сломаться. Например, если я переключу заказ утверждения в рабочий процесс, мне также необходимо обновить логику в службе WCF. В противном случае он отобразит недопустимое состояние страницы, и нажатие кнопки подтверждения приведет к неправильному методу и вызовет исключение FaultException.

Любая помощь будет очень оценена... Я действительно новичок в WF4.

UPDATE:

Мой коллега поставил мой вопрос таким образом:

Какой лучший дизайн для веб-приложения, использующего WF?

Основные причины, по которым рассматривается WF  - Применяемые рабочие процессы долго выполняются  - Рабочие процессы - это человеческие рабочие процессы - им необходимо координировать действия реальных людей  - Прозрачность процесса

Также, как рабочий процесс интегрируется с пользовательским интерфейсом? - как UI узнает, в каком состоянии должно быть и на каких страницах показывать, какие пользователи?

Ответ 1

Сам рабочий процесс не предоставляет информацию напрямую. Он существует, так как каждый ожидающий Receive является именованной закладкой, а имя закладки содержит поддерживаемое SOAP-действие, а также контракт на обслуживание и пространство имен. Самый простой способ добиться этого - добавить SqlWorkflowInstanceStore к WorkflowServiceHost и проверить столбец с ожидающими закладками. Это не идеально, так как это даст вам информацию, поскольку она была последней, которая не обязательно является текущим состоянием, но она работала для меня в ряде приложений. Просто убедитесь, что TimeToPersist имеет довольно низкое значение и добавляет некоторые действия Persist в стратегических местах.

Ответ 2

Очень простой подход будет имитировать рабочий процесс, управляя статусом утверждений. Представьте, что у вас есть разные кнопки/страницы для разных пользователей, которые одобряют разные этапы ( "создание", "утверждение менеджера", "одобрение RA" и т.д.) Процесса утверждения. Это очень старый школьный подход.

Если вы используете этот подход, вам необходимо распределить рабочий процесс (логика/процесс) по разным местам (страницам). Очевидно, что это недостаток этого подхода, особенно когда ваш рабочий процесс сильно меняется, или ваши решения должны запускать разные версии рабочего процесса.

Если вы хотите использовать Workflow Foundation, самый простой способ - это то, что предложил Морис.

Другой вариант - использовать другие инструменты, которые будут масштабироваться больше и более гибкие, чем WF. Я использовал WF (не последний релиз), BizTalk и SharePoint.

Если ваше решение требует взаимодействия с другими приложениями, я бы рекомендовал использовать BizTalk.