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); } }
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); } } }
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); } }
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)); }); }
/// <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)); } } }
public async Task HandleAsync(ProfileModified message) { var matchedProfile = await _matcher.RematchProfileAsync(message.ProfileId); await _domainEventBus.Publish(new ProfileMatched(matchedProfile.ProfileId, matchedProfile.MatchingProfileIds)); }