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); } }
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)); }
bool IncludesInitial() { return(_machine.States .Where(state => _machine.NextEvents(state).Contains(Event)) .Any(x => x.Name.Equals(_machine.Initial.Name))); }