protected void HandleDomainUpdate(DomainUpdateBusMessage domainUpdate)
        {
            using (var scope = _container.BeginLifetimeScope())
            {
                var events = domainUpdate.Events.Select(e => JsonSerializer.Deserialize(e)).ToArray();

                var hook = scope.ResolveOptional<IDomainUpdateServiceBusHandlerHook>();

                if (hook != null)
                    hook.PreHandle(events, domainUpdate.Metadata);

                try
                {
                    foreach (var @event in events)
                    {
                        if(_logger.IsDebugEnabled)
                           _logger.Debug("Received message contains event with type " + @event.GetType().Name);

                        if (hook != null)
                            hook.PreHandleEvent(@event, domainUpdate.Metadata);

                        var eventType = @event.GetType();
                        List<Type> handlerTypes;

                        if (_eventTypesWithHandlers.TryGetValue(eventType, out handlerTypes))
                        {
                            if (_logger.IsDebugEnabled)
                                _logger.Debug("Sending received event to " + handlerTypes.Count + " handlers.");

                            foreach (var handlerType in handlerTypes)
                            {
                                var handler = scope.Resolve(handlerType);

                                handler.AsDynamic().Handle(@event);
                            }
                        }

                        if (hook != null)
                            hook.PostHandleEvent(@event, domainUpdate.Metadata);
                    }

                    if (hook != null)
                        hook.PostHandle(events, domainUpdate.Metadata);
                }
                catch (Exception ex)
                {
                    if (hook != null)
                        hook.Exception(ex, events, domainUpdate.Metadata);

                    throw;
                }
            }
        }
 protected override void Publish(DomainUpdateBusMessage message)
 {
     _bus.Publish(message);
 }
 protected abstract void Publish(DomainUpdateBusMessage message);
 protected override void Publish(DomainUpdateBusMessage message)
 {
     HandleDomainUpdate((DomainUpdateBusMessage)JsonSerializer.Deserialize(JsonSerializer.Serialize(message)));
 }