using Femto.Common.Domain; using Femto.Modules.Media.Data; using MediatR; namespace Femto.Modules.Media.Infrastructure.PipelineBehaviours; internal class DomainEventsPipelineBehaviour( MediaContext context, IPublisher publisher) : IPipelineBehavior where TRequest : notnull { public async Task Handle( TRequest request, RequestHandlerDelegate next, CancellationToken cancellationToken) { var response = await next(cancellationToken); var domainEvents = context.ChangeTracker .Entries() .SelectMany(e => { var events = e.Entity.DomainEvents; e.Entity.ClearDomainEvents(); return events; }) .ToList(); foreach (var domainEvent in domainEvents) { await publisher.Publish(domainEvent, cancellationToken); } return response; } }