Теперь вы создали работающий последовательный рабочий процесс, который содержит все три составляющие приложения рабочих процессов: рабочий процесс, хост и клиент. Эти части являются концептуальными составляющими нашего единого приложения. Однако при необходимости вы могли бы выделить их в отдельные части. Вот концептуальные части приложения (файлы) с разбивкой на рабочий процесс, хост и клиент:
О рабочий процесс — TravelRequestProcess, IApproval, INotification, IUserProfile;
□ хост — частично содержится в Program.cs, ManageApproval, Notification;
□ клиент — Program.cs (содержит не только ввод пользователя, но и код хоста).
Теперь вы можете запустить рабочий процесс и протестировать его. Он должен откомпили- роваться, а затем выдать вам консольное приложение по вводу информации для запроса на поездку. Вы можете ввести информацию и запустить рабочий процесс. Начнет выполняться логика, и если потребуется утверждение, то вы получите подсказку для его ввода. На рис. 20.15 показан проход по рабочему процессу.
Отладка рабочего процесса
Вы можете настраивать точки останова в коде любого проекта вашего решения и проходить код пошагово (точно так же, как и в любом другом приложении). Кроме того, вы можете визуально проходить по выполняющемуся рабочему процессу.
Рис. 20.16. Рабочий процесс запроса на поездку выполняется в отладчике
Для настройки точки останова в вашем процессе сначала выделите то действие, на котором вы хотите прервать выполнение. Щелкните по этому действию правой кнопкой мыши и выберите пункт Breakpoint | Insert Breakpoint. При этом на действие будет установлен красный значок точки останова. Когда вы теперь будете выполнять рабочий процесс, он остановится на этом действии. После этого вы можете использовать окно Immediate и команды пошагового прохождения (точно так же, как и для обычного кода).
На рис. 20.16 показан пример рабочего процесса запроса на поездку, который открыт в отладчике. Вы видите, что окно Locals показывает параметры, соответствующие рабочему процессу.
Совет
Windows Workflow предоставляет также и действия для обработки ошибок. Есть действие FaultHandler, которое работает во многом аналогично блокам кода try... catch.