예제 #1
0
        private void OnReceived(Object sender, BasicDeliverEventArgs e)
        {
            try
            {
                var message       = _rabbitMqMessageFactory.Create(e);
                var eventMetadata = new EventMetadata(message.Headers.ToDictionary(kv => kv.Key, kv => Encoding.UTF8.GetString((Byte[])kv.Value)));

                var eventDefinition = _applicationDefinition.Events.GetDefinition(eventMetadata.EventName, eventMetadata.EventVersion);

                if (eventDefinition == null)
                {
                    _channel.BasicAck(e.DeliveryTag, false);
                    return;
                }

                var aggregateEvent = (IAggregateEvent)JsonConvert.DeserializeObject(message.Message, eventDefinition.Type);

                var domainEvent = _domainEventFactory.Create(aggregateEvent, eventMetadata);

                _domainEventBus.Publish(domainEvent);
            }
            catch
            {
                if (_connection.IsOpen)
                {
                    _channel.BasicNack(e.DeliveryTag, false, false);
                }
            }

            if (_connection.IsOpen)
            {
                _channel.BasicAck(e.DeliveryTag, false);
            }
        }
예제 #2
0
        protected void Provide(IDomainEvent domainEvent)
        {
            if (_eventTypes.Contains(domainEvent.EventType) == false)
            {
                return;
            }

            _eventBus.Publish(domainEvent);
        }
 /// <summary>
 /// Dispatches all Domain Events.
 /// </summary>
 /// <param name="eventBus"></param>
 /// <param name="entities"></param>
 /// <returns></returns>
 public static async Task DispatchDomainEventsAsync(this IDomainEventBus eventBus, IEnumerable <IDomainEventEntity> entities)
 {
     foreach (IDomainEventEntity entity in entities)
     {
         foreach (IDomainEvent domainEvent in entity.DomainEvents)
         {
             entity.RemoveDomainEvent(domainEvent);
             await eventBus.Publish(domainEvent).ConfigureAwait(false);
         }
     }
 }
예제 #4
0
        public void Handle(AccountReinstated @event)
        {
            //SHOWS A CONCRETE EXAMPLE OF EVENT REPLAY

            var events = _accountStore.GetAggregateEvents(@event.AccountId);

            var reinstatingStream = BuilderReinstatingStream(events);

            foreach (var e in reinstatingStream)
            {
                _domainEventBus.Publish(e.Event);
            }
        }
예제 #5
0
        public override void Handle(AddNewPropertyDomainCommand command)
        {
            WithinTransaction(command, cmd =>
            {
                // *Actual Processing*
                var property = Property.Create(cmd.Name, cmd.Price);
                // /*Actual Processing*  (did you miss it?)

                // Capture the aggregate events
                rootEventStore.SaveEvents(property);

                // Raise the fact we created a property externally
                domainEventBus.Publish(new PropertyRegisteredDomainEvent(cmd.Id, cmd.Name, cmd.Price));
            });
        }
예제 #6
0
        /// <summary>
        ///   Source:
        ///   https://github.com/ardalis/CleanArchitecture/blob/master/src/CleanArchitecture.Infrastructure/Data/AppDbContext.cs
        /// </summary>
        private void SaveChangesWithEvents(IDomainEventBus domainEventBus)
        {
            var entitiesWithEvents = ChangeTracker.Entries <IAggregateRoot>()
                                     .Select(e => e.Entity)
                                     .Where(e => e.GetUncommittedEvents().Any())
                                     .ToArray();

            foreach (var entity in entitiesWithEvents)
            {
                var events = entity.GetUncommittedEvents().ToArray();
                entity.GetUncommittedEvents().Clear();
                foreach (var domainEvent in events)
                {
                    domainEventBus.Publish(new EventEnvelope(domainEvent));
                }
            }
        }
예제 #7
0
 public async Task HandleAsync(ProfileModified message)
 {
     var matchedProfile = await _matcher.RematchProfileAsync(message.ProfileId);
     await _domainEventBus.Publish(new ProfileMatched(matchedProfile.ProfileId, matchedProfile.MatchingProfileIds));
 }