public async Task Send(SagaConsumeContext <TInstance, TData> context, IPipe <SagaConsumeContext <TInstance, TData> > next)
        {
            var eventContext = new StateMachineEventContext <TInstance, TData>(_machine, context.Saga, _event, context.Message, context.CancellationToken);

            eventContext.GetOrAddPayload(() => context);
            eventContext.GetOrAddPayload(() => (ConsumeContext <TData>)context);
            eventContext.GetOrAddPayload(() => (ConsumeContext)context);

            State <TInstance> currentState = await _machine.Accessor.Get(eventContext).ConfigureAwait(false);

            IEnumerable <Event> nextEvents = _machine.NextEvents(currentState);

            if (nextEvents.Contains(_event))
            {
                await _machine.RaiseEvent(eventContext).ConfigureAwait(false);

                if (_machine.IsCompleted(context.Saga))
                {
                    await context.SetCompleted().ConfigureAwait(false);
                }
            }
            else
            {
                throw new NotAcceptedStateMachineException(typeof(TInstance), typeof(TData), context.CorrelationId ?? Guid.Empty, currentState.Name);
            }
        }
Exemplo n.º 2
0
        ISagaPolicy <TInstance, TData> GetSagaPolicy()
        {
            State[] states = _machine.States
                             .Where(state => _machine.NextEvents(state).Contains(_event))
                             .ToArray();

            var includesInitial = states.Any(x => x.Name.Equals(_machine.Initial.Name));

            if (includesInitial)
            {
                return(new NewOrExistingSagaPolicy <TInstance, TData>(_sagaFactory, _insertOnInitial));
            }

            return(new AnyExistingSagaPolicy <TInstance, TData>(_missingPipe));
        }
Exemplo n.º 3
0
 bool IncludesInitial()
 {
     return(_machine.States
            .Where(state => _machine.NextEvents(state).Contains(Event))
            .Any(x => x.Name.Equals(_machine.Initial.Name)));
 }