Example #1
0
 public EventObservationStageDetails(ObservationStage stage)
 {
     Stage          = stage;
     ReceivedEvents = new List <TEvent>();
     _actions       = new List <Action <TModel, TEvent, IEventContext> >();
     Actions        = new ReadOnlyCollection <Action <TModel, TEvent, IEventContext> >(_actions);
 }
Example #2
0
 public IEventObservable <TEvent, IEventContext, TModel> GetEventObservable <TEvent>(ObservationStage observationStage = ObservationStage.Normal)
 {
     if (_modelIid == null)
     {
         ThrowAsModelNotSet();
     }
     return(_underlying.GetEventObservable <TEvent, TModel>(_modelIid, observationStage));
 }
Example #3
0
            private EventObservationStageDetails <TEvent> WireUpObservationStage <TEvent>(ObservationStage stage) where TEvent : BaseEvent
            {
                var details = new EventObservationStageDetails <TEvent>(stage);

                details.ObservationDisposable = _router.GetEventObservable <TEvent, TModel>(_modelId, details.Stage)
                                                .Observe(
                    (@event, context, model) =>
                {
                    details.ReceivedEvents.Add(@event);
                    var shouldCancel = @event.ShouldCancel && stage == @event.CancelAtStage && @event.CancelAtEventProcesserId == _id;
                    if (shouldCancel)
                    {
                        context.Cancel();
                    }
                    var shouldCommit = @event.ShouldCommit && stage == @event.CommitAtStage && @event.CommitAtEventProcesserId == _id;
                    if (shouldCommit)
                    {
                        context.Commit();
                    }
                    var shouldRemove = @event.ShouldRemove && stage == @event.RemoveAtStage && @event.RemoveAtEventProcesserId == _id;
                    if (shouldRemove)
                    {
                        _router.RemoveModel(_modelId);
                    }
                    foreach (Action <TModel, TEvent, IEventContext> action in details.Actions)
                    {
                        action(model, @event, context);
                    }
                },
                    () => details.StreamCompletedCount++);
                return(details);
            }
Example #4
0
        public IEventObservable <TEvent, IEventContext, TModel> GetEventObservable <TEvent, TModel>(object modelId, ObservationStage observationStage = ObservationStage.Normal)
        {
            _state.ThrowIfHalted();
            IModelRouter <TModel> modelRouter = GetModelRouter <TModel>(modelId);

            return(modelRouter.GetEventObservable <TEvent>(observationStage));
        }
Example #5
0
 public IEventObservable <TEvent, IEventContext, TSubModel> GetEventObservable <TEvent>(ObservationStage observationStage = ObservationStage.Normal)
 {
     return(_underlying.GetEventObservable <TEvent, TModel>(_modelIid, observationStage).Select(_selector));
 }
 private void AssertLastReceivedEvent(int expectedEventReceivedCount, ObservationStage expectedObservationStage, BaseEvent sent)
 {
     _receivedEvents.Count.ShouldBe(expectedEventReceivedCount);
     _receivedEvents[expectedEventReceivedCount - 1].Item2.ShouldBe(expectedObservationStage);
     _receivedEvents[expectedEventReceivedCount - 1].Item1.ShouldBe(sent);
 }
Example #7
0
 public ObserveEventAttribute(Type eventType, ObservationStage stage)
 {
     EventType = eventType;
     Stage     = stage;
 }
Example #8
0
            /// <summary>
            /// Returns an IEventObservable that will yield events of type TEvent when observed.
            /// </summary>
            /// <typeparam name="TEvent">Type type of event to observe</typeparam>
            /// <param name="observationStage">The stage in the event processing workflow you wish to observe at</param>
            /// <returns></returns>
            public IEventObservable <TEvent, IEventContext, TModel> GetEventObservable <TEvent>(ObservationStage observationStage = ObservationStage.Normal)
            {
                return(EventObservable.Create <TEvent, IEventContext, TModel>(o =>
                {
                    _state.ThrowIfHalted();
                    EventSubjects <TEvent> eventSubjects;
                    lock (_gate)
                    {
                        var eventType = typeof(TEvent);
                        if (!_eventSubjects.ContainsKey(eventType))
                        {
                            eventSubjects = new EventSubjects <TEvent>(_eventObservationRegistrar);
                            _eventSubjects[eventType] = eventSubjects;
                        }
                        else
                        {
                            eventSubjects = (EventSubjects <TEvent>)_eventSubjects[eventType];
                        }
                    }
                    EventSubject <TEvent, IEventContext, TModel> subject;
                    switch (observationStage)
                    {
                    case ObservationStage.Preview:
                        subject = eventSubjects.PreviewSubject;
                        break;

                    case ObservationStage.Normal:
                        subject = eventSubjects.NormalSubject;
                        break;

                    case ObservationStage.Committed:
                        subject = eventSubjects.CommittedSubject;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException(string.Format("observationStage {0} not supported", observationStage));
                    }
                    return subject.Observe(o);
                }));
            }