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);
        }
Exemple #2
0
        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;
            }));
        }
Exemple #3
0
 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}");
         }
     }
 }