From cb4da9864d2a38c1fdd35abba1600b75c5a54075 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 21 Mar 2017 12:55:33 -0700 Subject: [PATCH] Dispatching Domain Events right before DbContext SaveChanges() so side effects from additional Domain Event Handlers are included within the same transaction --- .../Ordering.Infrastructure/OrderingContext.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs b/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs index de3f870da..d28b4e3f9 100644 --- a/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs +++ b/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs @@ -237,10 +237,18 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Infrastructure public async Task SaveEntitiesAsync(CancellationToken cancellationToken = default(CancellationToken)) { + // Dispatch Domain Events collection. + // Choices: + // A) Right BEFORE committing data (EF SaveChanges) into the DB will make a single transaction including + // side effects from the domain event handlers which are using the same DbContext with "InstancePerLifetimeScope" or "scoped" lifetime + // B) Right AFTER committing data (EF SaveChanges) into the DB. will make multiple transactions. + // You will need to handle eventual consistency and compensatory actions in case of failures. + await _mediator.DispatchDomainEventsAsync(this); + + + // After executing this line all the changes performed thought the DbContext will be commited var result = await base.SaveChangesAsync(); - // Dispatch the Domain Events collection right after saving/committing data into the database - await _mediator.DispatchDomainEventsAsync(this); return result; } }