Beispiel #1
0
        public override async Task <int> SaveChangesAsync(
            CancellationToken cancellationToken = default(CancellationToken))
        {
            // TODO: What exception handling/unwrapping that needs to take place?

            // TODO: Concerned about single responsibility. This has two:
            // TODO:     1. Persisting data to DB
            // TODO:     2. Publishing events to propagate side-effects
            // TODO: Consider pulling the event dispatching out
            // TODO: and handling elsewhere.

            var aggregatesWithDomainEvents = ChangeTracker.Entries <IAggregateRoot>()
                                             .Select(e => e.Entity)
                                             .Where(e => e.Events.Any())
                                             .ToArray();

            await _dispatcher
            .DispatchAndClearDomainEventsAsync(aggregatesWithDomainEvents);

            // TODO: Get time span from configuration
            _integrationEvents.CopyToOutbox(_outboxService, TimeSpan.FromDays(7));

            var saveResult =
                await base.SaveChangesAsync(cancellationToken); // Aggregate and outbox changes

            var publishedEvents = await _integrationEvents
                                  .PublishToBus(_busSender);

            // TODO: Add scheduled retries for packages left in outbox
            publishedEvents.RemoveFromOutbox(_outboxService);

            await base.SaveChangesAsync(cancellationToken); // Outbox changes

            return(saveResult);
        }