diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs index 609f5501a8..25135a0b9b 100644 --- a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs +++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs @@ -34,7 +34,11 @@ public class UnitOfWork : IUnitOfWork, ITransientDependency public string? ReservationName { get; set; } protected List> CompletedHandlers { get; } = new List>(); + + protected List?>> DistributedEventWithPredicates { get; } = new List?>>(); protected List DistributedEvents { get; } = new List(); + + protected List?>> LocalEventWithPredicates { get; } = new List?>>(); protected List LocalEvents { get; } = new List(); public event EventHandler Failed = default!; @@ -135,24 +139,31 @@ public class UnitOfWork : IUnitOfWork, ITransientDependency _isCompleting = true; await SaveChangesAsync(cancellationToken); + DistributedEvents.AddRange(GetEventsRecords(DistributedEventWithPredicates)); + LocalEvents.AddRange(GetEventsRecords(LocalEventWithPredicates)); + while (LocalEvents.Any() || DistributedEvents.Any()) { if (LocalEvents.Any()) { var localEventsToBePublished = LocalEvents.OrderBy(e => e.EventOrder).ToArray(); + LocalEventWithPredicates.Clear(); LocalEvents.Clear(); await UnitOfWorkEventPublisher.PublishLocalEventsAsync( localEventsToBePublished ); + LocalEvents.AddRange(GetEventsRecords(LocalEventWithPredicates)); } if (DistributedEvents.Any()) { var distributedEventsToBePublished = DistributedEvents.OrderBy(e => e.EventOrder).ToArray(); + DistributedEventWithPredicates.Clear(); DistributedEvents.Clear(); await UnitOfWorkEventPublisher.PublishDistributedEventsAsync( distributedEventsToBePublished ); + DistributedEvents.AddRange(GetEventsRecords(DistributedEventWithPredicates)); } await SaveChangesAsync(cancellationToken); @@ -244,38 +255,44 @@ public class UnitOfWork : IUnitOfWork, ITransientDependency UnitOfWorkEventRecord eventRecord, Predicate? replacementSelector = null) { - AddOrReplaceEvent(LocalEvents, eventRecord, replacementSelector); + LocalEventWithPredicates.Add(new KeyValuePair?>(eventRecord, replacementSelector)); } public virtual void AddOrReplaceDistributedEvent( UnitOfWorkEventRecord eventRecord, Predicate? replacementSelector = null) { - AddOrReplaceEvent(DistributedEvents, eventRecord, replacementSelector); + DistributedEventWithPredicates.Add(new KeyValuePair?>(eventRecord, replacementSelector)); } - public virtual void AddOrReplaceEvent( - List eventRecords, - UnitOfWorkEventRecord eventRecord, - Predicate? replacementSelector = null) + protected virtual List GetEventsRecords(List?>> eventWithPredicates) { - if (replacementSelector == null) - { - eventRecords.Add(eventRecord); - } - else + var eventRecords = new List(); + foreach (var eventWithPredicate in eventWithPredicates) { - var foundIndex = eventRecords.FindIndex(replacementSelector); - if (foundIndex < 0) + var eventRecord = eventWithPredicate.Key; + var replacementSelector = eventWithPredicate.Value; + + if (replacementSelector == null) { eventRecords.Add(eventRecord); } else { - eventRecord.SetOrder(eventRecords[foundIndex].EventOrder); - eventRecords[foundIndex] = eventRecord; + var foundIndex = eventRecords.FindIndex(replacementSelector); + if (foundIndex < 0) + { + eventRecords.Add(eventRecord); + } + else + { + eventRecord.SetOrder(eventRecords[foundIndex].EventOrder); + eventRecords[foundIndex] = eventRecord; + } } } + + return eventRecords; } protected virtual async Task OnCompletedAsync()