Browse Source

Merge pull request #21293 from abpframework/auto-merge/rel-9-0/3175

Merge branch dev with rel-9.0
pull/21305/head
maliming 2 years ago
committed by GitHub
parent
commit
81f5914101
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 47
      framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs

47
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<Func<Task>> CompletedHandlers { get; } = new List<Func<Task>>();
protected List<KeyValuePair<UnitOfWorkEventRecord, Predicate<UnitOfWorkEventRecord>?>> DistributedEventWithPredicates { get; } = new List<KeyValuePair<UnitOfWorkEventRecord, Predicate<UnitOfWorkEventRecord>?>>();
protected List<UnitOfWorkEventRecord> DistributedEvents { get; } = new List<UnitOfWorkEventRecord>();
protected List<KeyValuePair<UnitOfWorkEventRecord, Predicate<UnitOfWorkEventRecord>?>> LocalEventWithPredicates { get; } = new List<KeyValuePair<UnitOfWorkEventRecord, Predicate<UnitOfWorkEventRecord>?>>();
protected List<UnitOfWorkEventRecord> LocalEvents { get; } = new List<UnitOfWorkEventRecord>();
public event EventHandler<UnitOfWorkFailedEventArgs> 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<UnitOfWorkEventRecord>? replacementSelector = null)
{
AddOrReplaceEvent(LocalEvents, eventRecord, replacementSelector);
LocalEventWithPredicates.Add(new KeyValuePair<UnitOfWorkEventRecord, Predicate<UnitOfWorkEventRecord>?>(eventRecord, replacementSelector));
}
public virtual void AddOrReplaceDistributedEvent(
UnitOfWorkEventRecord eventRecord,
Predicate<UnitOfWorkEventRecord>? replacementSelector = null)
{
AddOrReplaceEvent(DistributedEvents, eventRecord, replacementSelector);
DistributedEventWithPredicates.Add(new KeyValuePair<UnitOfWorkEventRecord, Predicate<UnitOfWorkEventRecord>?>(eventRecord, replacementSelector));
}
public virtual void AddOrReplaceEvent(
List<UnitOfWorkEventRecord> eventRecords,
UnitOfWorkEventRecord eventRecord,
Predicate<UnitOfWorkEventRecord>? replacementSelector = null)
protected virtual List<UnitOfWorkEventRecord> GetEventsRecords(List<KeyValuePair<UnitOfWorkEventRecord, Predicate<UnitOfWorkEventRecord>?>> eventWithPredicates)
{
if (replacementSelector == null)
{
eventRecords.Add(eventRecord);
}
else
var eventRecords = new List<UnitOfWorkEventRecord>();
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()

Loading…
Cancel
Save