private void SaveDomainEvents() { var domainEventEntities = ChangeTracker.Entries <IAggregate>() .Where(po => po.Entity.GetUndispatchedEvents().Any()) .Select(po => po.Entity) .ToList(); var domainEvents = domainEventEntities .SelectMany(dee => dee.GetUndispatchedEvents().Select(ev => new DomainEventRecord(ev))) .ToList(); OzzyLogger <IDomainModelTracing> .TraceVerboseMessageIfEnabled(() => $"Saving {domainEvents.Count} domain events"); DomainEvents.AddRange(domainEvents); _eventsToSave.AddRange(domainEvents); foreach (var entity in domainEventEntities) { entity.ClearUndispatchedEvents(); } var removedEntitiesEvents = ChangeTracker.Entries <IEntity>() .Where(dbe => dbe.State == EntityState.Deleted) .Select(po => new EntityRemovedEvent(po.Entity)); var removedEntitiesDomainEvents = removedEntitiesEvents .Select(domainEvent => new DomainEventRecord(domainEvent)) .ToList(); OzzyLogger <IDomainModelTracing> .TraceVerboseMessageIfEnabled(() => $"Saving {removedEntitiesDomainEvents.Count} entity removed events"); DomainEvents.AddRange(removedEntitiesDomainEvents); _eventsToSave.AddRange(removedEntitiesDomainEvents); }
/// <summary> /// publish domain event /// </summary> /// <param name="domainEvents">domain event</param> public async Task PublishDomainEventAsync(params IDomainEvent[] domainEvents) { if (domainEvents.IsNullOrEmpty()) { return; } DomainEvents.AddRange(domainEvents); await DomainEventManager.PublishAsync(domainEvents).ConfigureAwait(false); }