public object Handle(IMessage message, object target) { var childEntity = _childEntityResolver.Invoke((ICommandMessage)message, target); if (childEntity == null) { throw new AggregateEntityNotFoundException( "Aggregate cannot handle this command, as there is no entity instance to forward it to." ); } var interceptors = _childHandlerInterceptors .Where(chi => chi.CanHandle(message)) .OrderBy(x => x.Priority) .Select(chi => new AnnotatedCommandHandlerInterceptor(chi, childEntity)) .ToList(); object result; if (interceptors.IsEmpty()) { result = _childHandler.Handle(message, childEntity); } else { result = new DefaultInterceptorChain(CurrentUnitOfWork.Get(), interceptors.GetEnumerator(), MessageHandler <ICommandMessage> .Create(m => _childHandler.Handle(message, childEntity))).Proceed(); } return(result); }
public object Handle(ICommandMessage msg) { return(ExecuteWithResult(() => { var interceptors = _inspector.CommandHandlerInterceptors .Where(chi => chi.CanHandle(msg)) .OrderBy(x => x.Priority) .Select(x => new AnnotatedCommandHandlerInterceptor(x, _aggregateRoot)) .ToList(); var handler = _inspector.CommandHandlers.GetValueOrDefault(msg.CommandName); object result; if (interceptors.IsEmpty()) { result = handler.Handle(msg, _aggregateRoot); } else { result = new DefaultInterceptorChain(CurrentUnitOfWork.Get(), interceptors.GetEnumerator(), MessageHandler <ICommandMessage> .Create(m => handler.Handle(msg, _aggregateRoot))).Proceed(); } if (_aggregateRoot == null) { _aggregateRoot = (T)result; return this.IdentifierAsString(); } return result; })); }
protected void ProcessInUnitOfWork(List <IEventMessage> eventMessages, IUnitOfWork unitOfWork, Segment segment) { try { unitOfWork.ExecuteWithResult(() => { var monitorCallback = _messageMonitor.OnMessageIngested(unitOfWork.Message); return(new DefaultInterceptorChain(unitOfWork, _interceptors.Keys.GetEnumerator(), MessageHandler <IEventMessage> .Create(m => { try { EventHandlerInvoker.Handle(m, segment); monitorCallback.ReportSuccess(); return null; } catch (Exception exception) { monitorCallback.ReportFailure(exception); throw; } })).Proceed()); }, _rollbackConfiguration); } catch (Exception e) { if (unitOfWork.IsRolledBack) { _errorHandler.HandleError(new ErrorContext(Name, e, eventMessages)); } else { _logger.LogInformation($"Exception occurred while processing a message, but unit of work was committed. {e.GetType().Name}"); } } }