Beispiel #1
0
        public void ProcessEvent <TEvent>(TEvent @event)
            where TEvent : IEvent
        {
            var starter = _definition.GetStarterPredicate <TEvent>()(@event, GetInstanceData());

            if (State == InstanceStates.NotStarted && starter)
            {
                StartProcess(@event);
            }

            switch (State)
            {
            case InstanceStates.NotStarted:
                return;

            case InstanceStates.Completed:
            case InstanceStates.Aborted:
                throw new Exception($"Cannot accept a new event. Instance is {State}");
            }

            var effect = _definition.GetEffectFunc <TEvent>()(@event, GetInstanceData());

            _effects.Add(effect);

            Emit(new EventReceived <TEvent>(@event));

            if (_definition.GetCompletionPredicate <TEvent>()(@event, GetInstanceData()))
            {
                Emit(new ProcessCompleted <TEvent>(@event));
            }
        }