public async Task Publish(StoredEvent message, System.Threading.CancellationToken cancellationToken) { try { Type messageType = StoredEventHelper.GetEventType(message.MessageType); var domainEvent = JsonConvert.DeserializeObject(message.Payload, messageType); if (messageType != null && domainEvent != null) { await _mediator.Publish(domainEvent, cancellationToken); } } catch (Exception ex) { _logger.LogError($"\n--- An error has occurred while publishing message {message.Id}: {ex.Message}\n"); } }
protected async override Task StoreEvents(CancellationToken cancellationToken) { var entities = DbContext.ChangeTracker.Entries() .Where(e => e.Entity is IAggregateRoot c && c.DomainEvents != null) .Select(e => e.Entity as IAggregateRoot) .ToArray(); foreach (var entity in entities) { var messages = entity.DomainEvents .Select(e => StoredEventHelper.BuildFromDomainEvent(e as DomainEvent, _eventSerializer)) .ToArray(); entity.ClearDomainEvents(); await DbContext.AddRangeAsync(messages, cancellationToken); } }