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)); }
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()); }
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; } } } }
public void ExecuteEvent <TEvent>(object modelId, TEvent @event) { _state.ThrowIfHalted(); _routerDispatcher.EnsureAccess(); _state.MoveToExecuting(modelId); IModelRouter modelRouter = GetModelRouter(modelId); modelRouter.ExecuteEvent(@event); _state.EndExecuting(); }
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(); }
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(); }
private IModelRouter GetNextModelEntryWithEvents() { IModelRouter modelRouter = null; lock (_gate) { foreach (IModelRouter entry in _modelsById.Values) { if (entry.HadEvents) { modelRouter = entry; break; } } } return(modelRouter); }