public static void DispatchDomainEvents(this IMediator mediator, StdDbContext ctx) { var domainEntities = ctx.ChangeTracker .Entries <BaseEntity>() .Where(x => x.Entity.DomainEvents != null && x.Entity.DomainEvents.Any()); var domainEvents = domainEntities .SelectMany(x => x.Entity.DomainEvents) .ToList(); domainEntities.ToList() .ForEach(entity => entity.Entity.ClearDomainEvents()); foreach (var domainEvent in domainEvents) { mediator.Publish(domainEvent);//.Wait(); } }
public static async Task DispatchDomainEventsAsync(this IMediator mediator, StdDbContext ctx, CancellationToken cancellationToken = default) { var domainEntities = ctx.ChangeTracker .Entries <BaseEntity>() .Where(x => x.Entity.DomainEvents != null && x.Entity.DomainEvents.Any()); var domainEvents = domainEntities .SelectMany(x => x.Entity.DomainEvents) .ToList(); domainEntities.ToList() .ForEach(entity => entity.Entity.ClearDomainEvents()); var tasks = domainEvents .Select(async(domainEvent) => { await mediator.Publish(domainEvent, cancellationToken).ConfigureAwait(false); }); await Task.WhenAll(tasks).ConfigureAwait(false); }