Exemplo n.º 1
0
        public async Task ProcessActionAsync <TMessage>(
            TMessage message,
            ISagaEvent <TMessage> sagaEvent,
            ISagaContext context,
            Func <TMessage, Task> onCompleted = null,
            Func <TMessage, Task> onRejected  = null)
        {
            var saga = (ISaga)sagaEvent;

            await Semaphore.WaitAsync();

            try
            {
                await sagaEvent.HandleAsync(message, context);
            }
            catch (Exception ex)
            {
                context.AddError(ex);
                saga.Reject();
            }
            finally
            {
                Semaphore.Release();
            }

            if (saga.State is SagaState.Rejected)
            {
                await onRejected(message);

                //compensate
            }
            else if (saga.State is SagaState.Completed)
            {
                await onCompleted(message);
            }
        }