protected override void ConsumeMessage(IMessageContext messageContext) { var eventContext = messageContext as MessageContext; var message = eventContext.Message; var messageHandlerTypes = HandlerProvider.GetHandlerTypes(message.GetType()); if (messageHandlerTypes.Count == 0) { return; } messageHandlerTypes.ForEach(messageHandlerType => { PerMessageContextLifetimeManager.CurrentMessageContext = eventContext; eventContext.ToBeSentMessageContexts.Clear(); var messageStore = IoCFactory.Resolve <IMessageStore>(); var subscriptionName = string.Format("{0}.{1}", SubscriptionName, messageHandlerType.FullName); if (!messageStore.HasEventHandled(eventContext.MessageID, subscriptionName)) { try { var messageHandler = IoCFactory.Resolve(messageHandlerType); ((dynamic)messageHandler).Handle((dynamic)message); var commandContexts = eventContext.ToBeSentMessageContexts; var eventBus = IoCFactory.Resolve <IEventBus>(); var messageContexts = new List <MessageContext>(); eventBus.GetMessages().ForEach(msg => messageContexts.Add(new MessageContext(msg))); messageStore.SaveEvent(eventContext, subscriptionName, commandContexts, messageContexts); if (commandContexts.Count > 0) { ((CommandBus)IoCFactory.Resolve <ICommandBus>()).SendCommands(commandContexts.AsEnumerable()); } if (messageContexts.Count > 0) { IoCFactory.Resolve <IEventPublisher>().Publish(messageContexts.ToArray()); } } catch (Exception e) { if (e is DomainException) { _Logger.Warn(message.ToJson(), e); } else { //IO error or sytem Crash _Logger.Error(message.ToJson(), e); } messageStore.SaveFailHandledEvent(eventContext, subscriptionName, e); } finally { PerMessageContextLifetimeManager.CurrentMessageContext = null; } } }); }