using MediatR; using Microsoft.eShopOnContainers.Services.Ordering.Domain.Seedwork; using Microsoft.eShopOnContainers.Services.Ordering.Infrastructure; using System.Linq; using System.Threading.Tasks; namespace Ordering.Infrastructure { public static class MediatorExtension { public static async Task RaiseDomainEventsAsync(this IMediator mediator, OrderingContext ctx) { var domainEntities = ctx.ChangeTracker.Entries().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.DomainEvents.Clear()); var tasks = domainEvents .Select(async (domainEvent) => { await mediator.PublishAsync(domainEvent); }); await Task.WhenAll(tasks); } } }