Конструирование eventDrivenApproval еще не совсем закончено. Сначала нам необходимо настроить шаблон обмена для отправки сообщений в рабочий процесс (при помощи события). Это позволит вам завершить настройку waitMgrApproval действия HandleExternalEvent.
Вспомним из последовательного рабочего процесса, что первый шаг процесса— это настройка интерфейса, объявленного в рабочем процессе. Хост-приложение создаст при помощи этого интерфейса класс реализации, а затем передаст его экземпляр в исполняющую среду рабочих процессов.
Для настройки обмена рабочего процесса с этим событием сделайте следующее:
1. Создайте новый файл кода Visual Basic и назовите его IApproval.vb.
2. В новом файле создайте новый класс, который наследует от ExternalDataEventArgs. Назовите этот класс ApprovalEventArgs. Добавьте в этот класс свойство с названием isApproved (типа Boolean). Это свойство будет хранить утверждение.
3. Добавьте интерфейс для события, которое будет порождаться для рабочего процесса. Назовите этот интерфейс lApproval. Это событие должно быть типа EventHandler<T>. Вы должны ввести его как новый класс аргументов события.
Ваш код должен выглядеть следующим образом:
Imports System.Workflow.Activities
<ExternalDataExchange()> _
Public Interface lApproval
Event Approval As EventHandler(Of ApprovalEventArgs)
End Interface
<Serializable()> _
Public Class ApprovalEventArgs Inherits ExternalDataEventArgs Public Sub New(ByVal instanceld As Guid)
MyBase.New(instanceld)
End Sub
Private _isApproved As Boolean Public Property IsApproved() As Boolean Get
Return _isApproved End Get
Set(ByVal value As Boolean)
_isApproved = value End Set End Property End Class
4. Вернитесь в рабочий процесс и откройте его файл выделенного кода. Добавьте свойство, которое будет привязано к аргументам события, посланным в действие HandleExter-
nalEvent. Назовите это свойство ApprovalEventArg. Ваше свойство должно выглядеть следующим образом:
Private _approvalEventArgs As ApprovalEventArgs Public Property ApprovalEventArg() As ApprovalEventArgs Get
Return _approvalEventArgs End Get
Set(ByVal value As ApprovalEventArgs)
_approvalEveritArgs = value End Set End Property
5. Вернитесь в визуальный конструктор рабочего процесса для действия eventDrivenApproval состояния Submitted. Перейдите в окно свойств для настройки в HandleExternalEvent действия waitMgrApproval на использование этого нового интерфейса. Настройте свойства InterfaceType, EventName и спроецируйте аргумент события е на только что созданное вами новое свойство. Ваша конфигурация должна выглядеть подобно показанной на рис. 20.20.
Рис. 20.20. Настройка действия waitMgrApproval
6. Последний шаг для настройки действий состояния Submitted— это настройка ветвей условия IfElse. Выделите левую ветвь (isApproved). В окне свойств укажите, что Condition имеет значение Declarative Rule Condition. В свойстве ConditionName откройте менеджер правил условия. Настройте в Rule Condition вычисление содержимого свойства ApprovalEventArg (к которому вы только что привязались). Это условие должно выглядеть так:
this._approvalEventArgs.IsApproved
7. Назовите условие ApprovedCondition. Это завершает состояние Submitted. Вернитесь в главный экран рабочего процесса конечного автомата.
Теперь вы должны увидеть линии, идущие от Submitted к Approved и к Rejected. Они представляют собой переходы (рис. 20.21). Теперь вам нужно настроить остальные состояния.
Конструирование и настройка состояния Approved
Состояние Approved (Утверждено) аналогично состоянию Submitted. Вам необходимо добавить в состояние Statelnitialization и действие EventDriven. Вот шаги для этого:
1. Добавьте действие Statelnitialization и назовите его approvedinit. Дважды щелкните по нему, чтобы открыть его визуальный конструктор.
2. Добавьте CodeActivity с названием NotifyFinance и опять выдайте на консоль имитацию уведомления финансовому отделу о том, что авансовый отчет готов к оплате. В реальной жизни это могут быть данные, отправленные в финансовую систему. Ваш код должен выглядеть следующим образом:
Private Sub NotifyFinance_ExecuteCode( _
ByVal sender As System.Object, ByVal e As System.EventArgs)
Console.WriteLine("Finance notice. Expenseld: " _
& _expenseReportId.ToString())
End Sub
3. Вернитесь к диаграмме состояний. Добавьте действие EventDriven с названием event Dr ivenPayment. Дважды щелкните по нему для того, чтобы открыть его визуальный конструктор.
4. Добавьте действие HandleExternalEvent для ожидания уведомления об оплате из финансовой системы. Назовите это действие waitForPaymentNotice.
5. Под ним добавьте SetState с названием set Paid. Используйте окно свойств для установки состояния Paid рабочего процесса (после получения оплаты).
6. Для настройки действия HandleExternalEvent создайте новый файл кода (аналогичный созданному ранее файлу IApproval.vb). Назовите его IPaymentNotice. Этот файл будет содержать интерфейс с событием, запускаемым финансовой системой. При его запуске будет присылаться номер чека оплаты авансового отчета. Этот код должен выглядеть следующим образом:
Imports System.Workflow.Activities
<ExternalDataExchange()> _
Public Interface IPaymentNotice
Event Approval As EventHandler(Of PaymentNoticeEventArgs)
End Interface
<Serializable()> _
Public Class PaymentNoticeEventArgs Inherits ExternalDataEventArgs
Public Sub New(ByVal instanceld As Guid)
MyBase.New(instanceld)
End Sub
Private _checkNumber As Integer Public Property CheckNumber() As Integer Get
Return _checkNumber End Get
Set(ByVal value As Integer)
_checkNumber = value End Set End Property
7. Используйте этот код для настройки действия HandleExternalEvent для действия EventDriven состояния Approved. Спроецируйте аргументы события из события е на новое свойство типа PaymentNoticeEventArgs рабочего процесса (вы можете вызвать это свойство paymentNoticeArgs). Действие состояния должно выглядеть подобно показанному на рис. 20.22.
Конструирование и настройка состояния Rejected
Внутри состояния Rejected (Отклонено) вы просто уведомляете пользователя об отклонении и помечаете рабочий процесс как завершенный. Вот шаги настройки состояния Rejected рабочего процесса:
1. Начните с добавления в состояние Rejected действия Statelnitialization. Назовите его rejectlnit. Дважды щелкните по нему для того, чтобы открыть его в визуальном конструкторе.
2. Добавьте CodeActivity в Statelnitialization состояния Rejected и назовите его Noti- fyRejection. Добавьте обработчик для этого действия и выдайте уведомление об отклонении в окно консоли, как это показано здесь:
Private Sub NotifyRejection_ExecuteCode( _
ByVal sender As System.Object, ByVal e As System.EventArgs)
Console.WriteLine("Expense report rejected. Expenseld: " _
& _expenseReportId.ToString()) .
End Sub
3. Добавьте действие SetState с названием SetComplete и установите его свойство Таг- getStateName в состояние Completed. Это покажет исполняющей среде, что рабочий процесс успешно завершился.