using SocialNetwork.Social.Domain.Common; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; namespace SocialNetwork.Social.Infrastructure.Data.Interceptors; public class DispatchDomainEventsInterceptor : SaveChangesInterceptor { public override InterceptionResult<int> SavingChanges(DbContextEventData eventData, InterceptionResult<int> result) { DispatchDomainEvents(eventData.Context).GetAwaiter().GetResult(); return base.SavingChanges(eventData, result); } public override async ValueTask<InterceptionResult<int>> SavingChangesAsync(DbContextEventData eventData, InterceptionResult<int> result, CancellationToken cancellationToken = default) { await DispatchDomainEvents(eventData.Context); return await base.SavingChangesAsync(eventData, result, cancellationToken); } public Task DispatchDomainEvents(DbContext? context) { if (context == null) return Task.CompletedTask; var entities = context.ChangeTracker .Entries<BaseEntity>() .Where(e => e.Entity.DomainEvents.Any()) .Select(e => e.Entity); var domainEvents = entities .SelectMany(e => e.DomainEvents) .ToList(); entities.ToList().ForEach(e => e.ClearDomainEvents()); foreach (var domainEvent in domainEvents) { // TODO Publish domain event } return Task.CompletedTask; } }