From 05e754662e3f0159406d0dab8ed2d3daa4b0a9b2 Mon Sep 17 00:00:00 2001 From: Marusyk Date: Thu, 29 Mar 2018 17:16:29 +0300 Subject: [PATCH 1/2] Ordering. Fixed async/await misuses --- .../Commands/CreateOrderCommandHandler.cs | 8 ++++---- ...edToAwaitingValidationDomainEventHandler.cs | 4 ++-- ...derStatusChangedToPaidDomainEventHandler.cs | 4 ++-- ...regateWhenOrderStartedDomainEventHandler.cs | 2 +- ...hangedToStockConfirmedDomainEventHandler.cs | 4 ++-- .../OrderingIntegrationEventService.cs | 4 ++-- .../Application/Queries/OrderQueries.cs | 8 ++++---- .../Infrastructure/OrderingContextSeed.cs | 18 +++++++++--------- .../MediatorExtension.cs | 4 ++-- 9 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs b/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs index c63f262fa..e49ae068b 100644 --- a/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs +++ b/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs @@ -24,7 +24,7 @@ _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator)); } - public async Task Handle(CreateOrderCommand message, CancellationToken cancellationToken) + public Task Handle(CreateOrderCommand message, CancellationToken cancellationToken) { // Add/Update the Buyer AggregateRoot // DDD patterns comment: Add child entities and value-objects through the Order Aggregate-Root @@ -40,8 +40,8 @@ _orderRepository.Add(order); - return await _orderRepository.UnitOfWork - .SaveEntitiesAsync(); + return _orderRepository.UnitOfWork + .SaveEntitiesAsync(cancellationToken); } } @@ -55,7 +55,7 @@ protected override bool CreateResultForDuplicateRequest() { - return true; // Ignore duplicate requests for creating order. + return true; // Ignore duplicate requests for creating order. } } } diff --git a/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderGracePeriodConfirmed/OrderStatusChangedToAwaitingValidationDomainEventHandler.cs b/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderGracePeriodConfirmed/OrderStatusChangedToAwaitingValidationDomainEventHandler.cs index a02d07232..d000ceecb 100644 --- a/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderGracePeriodConfirmed/OrderStatusChangedToAwaitingValidationDomainEventHandler.cs +++ b/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderGracePeriodConfirmed/OrderStatusChangedToAwaitingValidationDomainEventHandler.cs @@ -27,7 +27,7 @@ _orderingIntegrationEventService = orderingIntegrationEventService; } - public async Task Handle(OrderStatusChangedToAwaitingValidationDomainEvent orderStatusChangedToAwaitingValidationDomainEvent, CancellationToken cancellationToken) + public Task Handle(OrderStatusChangedToAwaitingValidationDomainEvent orderStatusChangedToAwaitingValidationDomainEvent, CancellationToken cancellationToken) { _logger.CreateLogger(nameof(OrderStatusChangedToAwaitingValidationDomainEvent)) .LogTrace($"Order with Id: {orderStatusChangedToAwaitingValidationDomainEvent.OrderId} has been successfully updated with " + @@ -38,7 +38,7 @@ var orderStatusChangedToAwaitingValidationIntegrationEvent = new OrderStatusChangedToAwaitingValidationIntegrationEvent( orderStatusChangedToAwaitingValidationDomainEvent.OrderId, orderStockList); - await _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedToAwaitingValidationIntegrationEvent); + return _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedToAwaitingValidationIntegrationEvent); } } } \ No newline at end of file diff --git a/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderPaid/OrderStatusChangedToPaidDomainEventHandler.cs b/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderPaid/OrderStatusChangedToPaidDomainEventHandler.cs index 071cd90fc..300afda72 100644 --- a/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderPaid/OrderStatusChangedToPaidDomainEventHandler.cs +++ b/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderPaid/OrderStatusChangedToPaidDomainEventHandler.cs @@ -27,7 +27,7 @@ _orderingIntegrationEventService = orderingIntegrationEventService; } - public async Task Handle(OrderStatusChangedToPaidDomainEvent orderStatusChangedToPaidDomainEvent, CancellationToken cancellationToken) + public Task Handle(OrderStatusChangedToPaidDomainEvent orderStatusChangedToPaidDomainEvent, CancellationToken cancellationToken) { _logger.CreateLogger(nameof(OrderStatusChangedToPaidDomainEventHandler)) .LogTrace($"Order with Id: {orderStatusChangedToPaidDomainEvent.OrderId} has been successfully updated with " + @@ -38,7 +38,7 @@ var orderStatusChangedToPaidIntegrationEvent = new OrderStatusChangedToPaidIntegrationEvent(orderStatusChangedToPaidDomainEvent.OrderId, orderStockList); - await _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedToPaidIntegrationEvent); + return _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedToPaidIntegrationEvent); } } } \ No newline at end of file diff --git a/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStartedEvent/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs b/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStartedEvent/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs index d222c574c..058194df1 100644 --- a/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStartedEvent/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs +++ b/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStartedEvent/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs @@ -45,7 +45,7 @@ namespace Ordering.API.Application.DomainEventHandlers.OrderStartedEvent var buyerUpdated = buyerOriginallyExisted ? _buyerRepository.Update(buyer) : _buyerRepository.Add(buyer); await _buyerRepository.UnitOfWork - .SaveEntitiesAsync(); + .SaveEntitiesAsync(cancellationToken); _logger.CreateLogger(nameof(ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler)).LogTrace($"Buyer {buyerUpdated.Id} and related payment method were validated or updated for orderId: {orderStartedEvent.Order.Id}."); } diff --git a/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStockConfirmed/OrderStatusChangedToStockConfirmedDomainEventHandler.cs b/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStockConfirmed/OrderStatusChangedToStockConfirmedDomainEventHandler.cs index 3b24e43e6..e2cfaab06 100644 --- a/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStockConfirmed/OrderStatusChangedToStockConfirmedDomainEventHandler.cs +++ b/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStockConfirmed/OrderStatusChangedToStockConfirmedDomainEventHandler.cs @@ -26,14 +26,14 @@ _orderingIntegrationEventService = orderingIntegrationEventService; } - public async Task Handle(OrderStatusChangedToStockConfirmedDomainEvent orderStatusChangedToStockConfirmedDomainEvent, CancellationToken cancellationToken) + public Task Handle(OrderStatusChangedToStockConfirmedDomainEvent orderStatusChangedToStockConfirmedDomainEvent, CancellationToken cancellationToken) { _logger.CreateLogger(nameof(OrderStatusChangedToStockConfirmedDomainEventHandler)) .LogTrace($"Order with Id: {orderStatusChangedToStockConfirmedDomainEvent.OrderId} has been successfully updated with " + $"a status order id: {OrderStatus.StockConfirmed.Id}"); var orderStatusChangedToStockConfirmedIntegrationEvent = new OrderStatusChangedToStockConfirmedIntegrationEvent(orderStatusChangedToStockConfirmedDomainEvent.OrderId); - await _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedToStockConfirmedIntegrationEvent); + return _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedToStockConfirmedIntegrationEvent); } } } \ No newline at end of file diff --git a/src/Services/Ordering/Ordering.API/Application/IntegrationEvents/OrderingIntegrationEventService.cs b/src/Services/Ordering/Ordering.API/Application/IntegrationEvents/OrderingIntegrationEventService.cs index b3c0201b5..cdf1602a0 100644 --- a/src/Services/Ordering/Ordering.API/Application/IntegrationEvents/OrderingIntegrationEventService.cs +++ b/src/Services/Ordering/Ordering.API/Application/IntegrationEvents/OrderingIntegrationEventService.cs @@ -35,11 +35,11 @@ namespace Ordering.API.Application.IntegrationEvents await _eventLogService.MarkEventAsPublishedAsync(evt); } - private async Task SaveEventAndOrderingContextChangesAsync(IntegrationEvent evt) + private Task SaveEventAndOrderingContextChangesAsync(IntegrationEvent evt) { //Use of an EF Core resiliency strategy when using multiple DbContexts within an explicit BeginTransaction(): //See: https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency - await ResilientTransaction.New(_orderingContext) + return ResilientTransaction.New(_orderingContext) .ExecuteAsync(async () => { // Achieving atomicity between original ordering database operation and the IntegrationEventLog thanks to a local transaction await _orderingContext.SaveChangesAsync(); diff --git a/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs b/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs index 59cc8a823..ed78bf033 100644 --- a/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs +++ b/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs @@ -9,7 +9,7 @@ public class OrderQueries :IOrderQueries { - private string _connectionString = string.Empty; + private readonly string _connectionString = string.Empty; public OrderQueries(string constr) { @@ -21,7 +21,7 @@ { using (var connection = new SqlConnection(_connectionString)) { - connection.Open(); + await connection.OpenAsync(); var result = await connection.QueryAsync( @"select o.[Id] as ordernumber,o.OrderDate as date, o.Description as description, @@ -46,7 +46,7 @@ { using (var connection = new SqlConnection(_connectionString)) { - connection.Open(); + await connection.OpenAsync(); return await connection.QueryAsync(@"SELECT o.[Id] as ordernumber,o.[OrderDate] as [date],os.[Name] as [status],SUM(oi.units*oi.unitprice) as total FROM [ordering].[Orders] o @@ -61,7 +61,7 @@ { using (var connection = new SqlConnection(_connectionString)) { - connection.Open(); + await connection.OpenAsync(); return await connection.QueryAsync("SELECT * FROM ordering.cardtypes"); } diff --git a/src/Services/Ordering/Ordering.API/Infrastructure/OrderingContextSeed.cs b/src/Services/Ordering/Ordering.API/Infrastructure/OrderingContextSeed.cs index 53c53f052..9fc4bbe7b 100644 --- a/src/Services/Ordering/Ordering.API/Infrastructure/OrderingContextSeed.cs +++ b/src/Services/Ordering/Ordering.API/Infrastructure/OrderingContextSeed.cs @@ -20,15 +20,15 @@ public class OrderingContextSeed { - public async Task SeedAsync(OrderingContext context, IHostingEnvironment env,IOptions settings, ILogger logger) + public Task SeedAsync(OrderingContext context, IHostingEnvironment env,IOptions settings, ILogger logger) { var policy = CreatePolicy(logger, nameof(OrderingContextSeed)); - await policy.ExecuteAsync(async () => + return policy.ExecuteAsync(async () => { var useCustomizationData = settings.Value - .UseCustomizationData; + .UseCustomizationData; var contentRootPath = env.ContentRootPath; @@ -39,18 +39,18 @@ if (!context.CardTypes.Any()) { - context.CardTypes.AddRange(useCustomizationData - ? GetCardTypesFromFile(contentRootPath, logger) - : GetPredefinedCardTypes()); + await context.CardTypes.AddRangeAsync(useCustomizationData + ? GetCardTypesFromFile(contentRootPath, logger) + : GetPredefinedCardTypes()); await context.SaveChangesAsync(); } if (!context.OrderStatus.Any()) { - context.OrderStatus.AddRange(useCustomizationData - ? GetOrderStatusFromFile(contentRootPath, logger) - : GetPredefinedOrderStatus()); + await context.OrderStatus.AddRangeAsync(useCustomizationData + ? GetOrderStatusFromFile(contentRootPath, logger) + : GetPredefinedOrderStatus()); } await context.SaveChangesAsync(); diff --git a/src/Services/Ordering/Ordering.Infrastructure/MediatorExtension.cs b/src/Services/Ordering/Ordering.Infrastructure/MediatorExtension.cs index 82a7235a2..2d1bd7d13 100644 --- a/src/Services/Ordering/Ordering.Infrastructure/MediatorExtension.cs +++ b/src/Services/Ordering/Ordering.Infrastructure/MediatorExtension.cs @@ -8,7 +8,7 @@ namespace Ordering.Infrastructure { static class MediatorExtension { - public static async Task DispatchDomainEventsAsync(this IMediator mediator, OrderingContext ctx) + public static Task DispatchDomainEventsAsync(this IMediator mediator, OrderingContext ctx) { var domainEntities = ctx.ChangeTracker .Entries() @@ -26,7 +26,7 @@ namespace Ordering.Infrastructure await mediator.Publish(domainEvent); }); - await Task.WhenAll(tasks); + return Task.WhenAll(tasks); } } } From ded950ca361436af019493dc3419ac0b4ec0a2a4 Mon Sep 17 00:00:00 2001 From: Marusyk Date: Thu, 29 Mar 2018 17:31:55 +0300 Subject: [PATCH 2/2] Ordering. Fixed async/await misuses --- .../Commands/CancelOrderCommandHandler.cs | 5 +++-- .../Commands/IdentifiedCommandHandler.cs | 21 ++++++++++--------- .../Commands/ShipOrderCommandHandler.cs | 5 +++-- .../OrderingContext.cs | 5 ++--- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/Services/Ordering/Ordering.API/Application/Commands/CancelOrderCommandHandler.cs b/src/Services/Ordering/Ordering.API/Application/Commands/CancelOrderCommandHandler.cs index a4c4facb8..f8ca93162 100644 --- a/src/Services/Ordering/Ordering.API/Application/Commands/CancelOrderCommandHandler.cs +++ b/src/Services/Ordering/Ordering.API/Application/Commands/CancelOrderCommandHandler.cs @@ -22,6 +22,7 @@ namespace Ordering.API.Application.Commands /// customer executes cancel order from app /// /// + /// /// public async Task Handle(CancelOrderCommand command, CancellationToken cancellationToken) { @@ -32,7 +33,7 @@ namespace Ordering.API.Application.Commands } orderToUpdate.SetCancelledStatus(); - return await _orderRepository.UnitOfWork.SaveEntitiesAsync(); + return await _orderRepository.UnitOfWork.SaveEntitiesAsync(cancellationToken); } } @@ -46,7 +47,7 @@ namespace Ordering.API.Application.Commands protected override bool CreateResultForDuplicateRequest() { - return true; // Ignore duplicate requests for processing order. + return true; // Ignore duplicate requests for processing order. } } } diff --git a/src/Services/Ordering/Ordering.API/Application/Commands/IdentifiedCommandHandler.cs b/src/Services/Ordering/Ordering.API/Application/Commands/IdentifiedCommandHandler.cs index f00ea44c8..312a775b4 100644 --- a/src/Services/Ordering/Ordering.API/Application/Commands/IdentifiedCommandHandler.cs +++ b/src/Services/Ordering/Ordering.API/Application/Commands/IdentifiedCommandHandler.cs @@ -37,6 +37,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands /// just enqueues the original inner command. /// /// IdentifiedCommand which contains both original command & request ID + /// /// Return value of inner command or default value if request same ID was found public async Task Handle(IdentifiedCommand message, CancellationToken cancellationToken) { @@ -48,16 +49,16 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands else { await _requestManager.CreateRequestForCommandAsync(message.Id); - try - { - // Send the embeded business command to mediator so it runs its related CommandHandler - var result = await _mediator.Send(message.Command); - return result; - } - catch - { - return default(R); - } + try + { + // Send the embeded business command to mediator so it runs its related CommandHandler + var result = await _mediator.Send(message.Command, cancellationToken); + return result; + } + catch + { + return default(R); + } } } } diff --git a/src/Services/Ordering/Ordering.API/Application/Commands/ShipOrderCommandHandler.cs b/src/Services/Ordering/Ordering.API/Application/Commands/ShipOrderCommandHandler.cs index b4a6ac26d..ae0086ce7 100644 --- a/src/Services/Ordering/Ordering.API/Application/Commands/ShipOrderCommandHandler.cs +++ b/src/Services/Ordering/Ordering.API/Application/Commands/ShipOrderCommandHandler.cs @@ -22,6 +22,7 @@ namespace Ordering.API.Application.Commands /// administrator executes ship order from app /// /// + /// /// public async Task Handle(ShipOrderCommand command, CancellationToken cancellationToken) { @@ -32,7 +33,7 @@ namespace Ordering.API.Application.Commands } orderToUpdate.SetShippedStatus(); - return await _orderRepository.UnitOfWork.SaveEntitiesAsync(); + return await _orderRepository.UnitOfWork.SaveEntitiesAsync(cancellationToken); } } @@ -46,7 +47,7 @@ namespace Ordering.API.Application.Commands protected override bool CreateResultForDuplicateRequest() { - return true; // Ignore duplicate requests for processing order. + return true; // Ignore duplicate requests for processing order. } } } diff --git a/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs b/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs index a2cfb96a5..dabf7d433 100644 --- a/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs +++ b/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs @@ -30,7 +30,6 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Infrastructure { _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator)); - System.Diagnostics.Debug.WriteLine("OrderingContext::ctor ->" + this.GetHashCode()); } @@ -57,7 +56,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Infrastructure // After executing this line all the changes (from the Command Handler and Domain Event Handlers) // performed throught the DbContext will be commited - var result = await base.SaveChangesAsync(); + var result = await base.SaveChangesAsync(cancellationToken); return true; } @@ -70,7 +69,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Infrastructure var optionsBuilder = new DbContextOptionsBuilder() .UseSqlServer("Server=.;Initial Catalog=Microsoft.eShopOnContainers.Services.OrderingDb;Integrated Security=true"); - return new OrderingContext(optionsBuilder.Options,new NoMediator()); + return new OrderingContext(optionsBuilder.Options, new NoMediator()); } class NoMediator : IMediator