示例#1
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));
        }
示例#2
0
        public IModelObservable <TModel> GetModelObservable <TModel>(object modelId)
        {
            Guard.Requires <ArgumentNullException>(modelId != null, "modelId can not be null");
            _state.ThrowIfHalted();
            IModelRouter <TModel> modelRouter = GetModelRouter <TModel>(modelId);

            return(modelRouter.GetModelObservable());
        }
示例#3
0
 private void PurgeEventQueues()
 {
     if (_state.CurrentStatus == Status.Idle)
     {
         try
         {
             IModelRouter modelRouter = GetNextModelEntryWithEvents();
             while (modelRouter != null)
             {
                 var changedModels = new Dictionary <object, IModelRouter>();
                 while (modelRouter != null)
                 {
                     _state.MoveToPreProcessing(modelRouter.Id);
                     modelRouter.RunPreProcessor();
                     if (!modelRouter.IsRemoved)
                     {
                         _state.MoveToEventDispatch();
                         modelRouter.PurgeEventQueue();
                         if (!modelRouter.IsRemoved)
                         {
                             _state.MoveToPostProcessing();
                             modelRouter.RunPostProcessor();
                         }
                     }
                     modelRouter.BroadcastModelChangedEvent();
                     if (!changedModels.ContainsKey(modelRouter.Id))
                     {
                         changedModels.Add(modelRouter.Id, modelRouter);
                     }
                     modelRouter = GetNextModelEntryWithEvents();
                 }
                 _state.MoveToDispatchModelUpdates();
                 foreach (IModelRouter changedModelEntry in changedModels.Values)
                 {
                     if (!changedModelEntry.IsRemoved)
                     {
                         changedModelEntry.DispatchModel();
                     }
                 }
                 modelRouter = GetNextModelEntryWithEvents();
             }
             _state.MoveToIdle();
         }
         catch (Exception ex)
         {
             _state.MoveToHalted(ex);
             if (_errorHandler != null)
             {
                 _errorHandler.OnError(ex);
             }
             else
             {
                 throw;
             }
         }
     }
 }
示例#4
0
        public void ExecuteEvent <TEvent>(object modelId, TEvent @event)
        {
            _state.ThrowIfHalted();
            _routerDispatcher.EnsureAccess();
            _state.MoveToExecuting(modelId);
            IModelRouter modelRouter = GetModelRouter(modelId);

            modelRouter.ExecuteEvent(@event);
            _state.EndExecuting();
        }
示例#5
0
        public void RunAction(object modelId, Action action)
        {
            if (!_routerDispatcher.CheckAccess())
            {
                _state.ThrowIfHalted();
                _routerDispatcher.Dispatch(() => RunAction(modelId, action));
                return;
            }
            _state.ThrowIfHalted();
            IModelRouter modelRouter = GetModelRouter(modelId);

            modelRouter.RunAction(action);
            PurgeEventQueues();
        }
示例#6
0
        public void PublishEvent <TEvent>(object modelId, TEvent @event)
        {
            if (!_routerDispatcher.CheckAccess())
            {
                _state.ThrowIfHalted();
                _routerDispatcher.Dispatch(() => PublishEvent(modelId, @event));
                return;
            }
            _state.ThrowIfHalted();
            IModelRouter modelRouter = GetModelRouter(modelId);

            modelRouter.TryEnqueue(@event);
            PurgeEventQueues();
        }
示例#7
0
        private IModelRouter GetNextModelEntryWithEvents()
        {
            IModelRouter modelRouter = null;

            lock (_gate)
            {
                foreach (IModelRouter entry in _modelsById.Values)
                {
                    if (entry.HadEvents)
                    {
                        modelRouter = entry;
                        break;
                    }
                }
            }
            return(modelRouter);
        }