public void PublishDomainUpdate(object[] events, DomainUpdateMetadate metadata)
        {
            if (_logger.IsDebugEnabled)
                _logger.Debug("Publishing a domain update for " + metadata.AggregateType);

            Publish(new DomainUpdateBusMessage
            {
                Events = events.Select(e => JsonSerializer.Serialize(e)).ToArray(),
                Metadata = metadata
            });
        }
        private void HandleDomainUpdate(object[] events, DomainUpdateMetadate metadata)
        {
            using (var scope = _container.BeginLifetimeScope())
            {
                var hook = scope.ResolveOptional<IDomainUpdateServiceBusHandlerHook>();

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

                try
                {
                    foreach (var @event in events)
                    {
                        if (hook != null)
                            hook.PreHandleEvent(@event, metadata);

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

                        if (_eventTypesWithHandlers.TryGetValue(eventType, out handlerTypes))
                        {
                            foreach (var handlerType in handlerTypes)
                            {
                                var handler = scope.Resolve(handlerType);

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

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

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

                    throw;
                }
            }
        }
        public void FromEventStore()
        {
            _mongo.GetDatabase()
                  .Drop();

            RegisterHandlers(typeof(Rebuild).Assembly);

            foreach (var commit in _eventStore.Advanced.GetFrom(DateTime.MinValue)
                .OrderBy(c => c.CommitStamp))
            {
                var metadata = new DomainUpdateMetadate
                {
                    AggregateId = Guid.Parse(commit.Headers[AggregateRootMetadata.AggregateIdHeader] as string),
                    AggregateType = commit.Headers[AggregateRootMetadata.AggregateTypeHeader] as string,
                    Tenant = commit.Headers[AggregateRootMetadata.TenantHeader] as string,
                    ApplicationService = "Rebuilder",
                    LastVersion = commit.StreamRevision
                };

                HandleDomainUpdate(commit.Events.Select(e => e.Body).ToArray(), metadata);
            }
        }
 public void Exception(System.Exception ex, object[] events, DomainUpdateMetadate metadata)
 {
 }
 public void PostHandleEvent(object @event, DomainUpdateMetadate metadata)
 {
 }
 public void PostHandle(object[] events, DomainUpdateMetadate metadata)
 {
 }
 public void PreHandle(object[] events, DomainUpdateMetadate metadata)
 {
     _tenantContext.SetTenantId(metadata.Tenant);
 }