Browse Source

Merge ded950ca36 into 0742f941fb

pull/568/merge
Roma Marusyk 6 years ago
committed by GitHub
parent
commit
b62a54dd70
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 47 additions and 45 deletions
  1. +3
    -2
      src/Services/Ordering/Ordering.API/Application/Commands/CancelOrderCommandHandler.cs
  2. +4
    -4
      src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs
  3. +11
    -10
      src/Services/Ordering/Ordering.API/Application/Commands/IdentifiedCommandHandler.cs
  4. +3
    -2
      src/Services/Ordering/Ordering.API/Application/Commands/ShipOrderCommandHandler.cs
  5. +2
    -2
      src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderGracePeriodConfirmed/OrderStatusChangedToAwaitingValidationDomainEventHandler.cs
  6. +2
    -2
      src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderPaid/OrderStatusChangedToPaidDomainEventHandler.cs
  7. +1
    -1
      src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStartedEvent/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs
  8. +2
    -2
      src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStockConfirmed/OrderStatusChangedToStockConfirmedDomainEventHandler.cs
  9. +2
    -2
      src/Services/Ordering/Ordering.API/Application/IntegrationEvents/OrderingIntegrationEventService.cs
  10. +4
    -4
      src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs
  11. +9
    -9
      src/Services/Ordering/Ordering.API/Infrastructure/OrderingContextSeed.cs
  12. +2
    -2
      src/Services/Ordering/Ordering.Infrastructure/MediatorExtension.cs
  13. +2
    -3
      src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs

+ 3
- 2
src/Services/Ordering/Ordering.API/Application/Commands/CancelOrderCommandHandler.cs View File

@ -22,6 +22,7 @@ namespace Ordering.API.Application.Commands
/// customer executes cancel order from app /// customer executes cancel order from app
/// </summary> /// </summary>
/// <param name="command"></param> /// <param name="command"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns> /// <returns></returns>
public async Task<bool> Handle(CancelOrderCommand command, CancellationToken cancellationToken) public async Task<bool> Handle(CancelOrderCommand command, CancellationToken cancellationToken)
{ {
@ -32,7 +33,7 @@ namespace Ordering.API.Application.Commands
} }
orderToUpdate.SetCancelledStatus(); 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() protected override bool CreateResultForDuplicateRequest()
{ {
return true; // Ignore duplicate requests for processing order.
return true; // Ignore duplicate requests for processing order.
} }
} }
} }

+ 4
- 4
src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs View File

@ -24,7 +24,7 @@
_mediator = mediator ?? throw new ArgumentNullException(nameof(mediator)); _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
} }
public async Task<bool> Handle(CreateOrderCommand message, CancellationToken cancellationToken)
public Task<bool> Handle(CreateOrderCommand message, CancellationToken cancellationToken)
{ {
// Add/Update the Buyer AggregateRoot // Add/Update the Buyer AggregateRoot
// DDD patterns comment: Add child entities and value-objects through the Order Aggregate-Root // DDD patterns comment: Add child entities and value-objects through the Order Aggregate-Root
@ -40,8 +40,8 @@
_orderRepository.Add(order); _orderRepository.Add(order);
return await _orderRepository.UnitOfWork
.SaveEntitiesAsync();
return _orderRepository.UnitOfWork
.SaveEntitiesAsync(cancellationToken);
} }
} }
@ -55,7 +55,7 @@
protected override bool CreateResultForDuplicateRequest() protected override bool CreateResultForDuplicateRequest()
{ {
return true; // Ignore duplicate requests for creating order.
return true; // Ignore duplicate requests for creating order.
} }
} }
} }

+ 11
- 10
src/Services/Ordering/Ordering.API/Application/Commands/IdentifiedCommandHandler.cs View File

@ -37,6 +37,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands
/// just enqueues the original inner command. /// just enqueues the original inner command.
/// </summary> /// </summary>
/// <param name="message">IdentifiedCommand which contains both original command & request ID</param> /// <param name="message">IdentifiedCommand which contains both original command & request ID</param>
/// <param name="cancellationToken"></param>
/// <returns>Return value of inner command or default value if request same ID was found</returns> /// <returns>Return value of inner command or default value if request same ID was found</returns>
public async Task<R> Handle(IdentifiedCommand<T, R> message, CancellationToken cancellationToken) public async Task<R> Handle(IdentifiedCommand<T, R> message, CancellationToken cancellationToken)
{ {
@ -48,16 +49,16 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands
else else
{ {
await _requestManager.CreateRequestForCommandAsync<T>(message.Id); await _requestManager.CreateRequestForCommandAsync<T>(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);
}
} }
} }
} }

+ 3
- 2
src/Services/Ordering/Ordering.API/Application/Commands/ShipOrderCommandHandler.cs View File

@ -22,6 +22,7 @@ namespace Ordering.API.Application.Commands
/// administrator executes ship order from app /// administrator executes ship order from app
/// </summary> /// </summary>
/// <param name="command"></param> /// <param name="command"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns> /// <returns></returns>
public async Task<bool> Handle(ShipOrderCommand command, CancellationToken cancellationToken) public async Task<bool> Handle(ShipOrderCommand command, CancellationToken cancellationToken)
{ {
@ -32,7 +33,7 @@ namespace Ordering.API.Application.Commands
} }
orderToUpdate.SetShippedStatus(); 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() protected override bool CreateResultForDuplicateRequest()
{ {
return true; // Ignore duplicate requests for processing order.
return true; // Ignore duplicate requests for processing order.
} }
} }
} }

+ 2
- 2
src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderGracePeriodConfirmed/OrderStatusChangedToAwaitingValidationDomainEventHandler.cs View File

@ -27,7 +27,7 @@
_orderingIntegrationEventService = orderingIntegrationEventService; _orderingIntegrationEventService = orderingIntegrationEventService;
} }
public async Task Handle(OrderStatusChangedToAwaitingValidationDomainEvent orderStatusChangedToAwaitingValidationDomainEvent, CancellationToken cancellationToken)
public Task Handle(OrderStatusChangedToAwaitingValidationDomainEvent orderStatusChangedToAwaitingValidationDomainEvent, CancellationToken cancellationToken)
{ {
_logger.CreateLogger(nameof(OrderStatusChangedToAwaitingValidationDomainEvent)) _logger.CreateLogger(nameof(OrderStatusChangedToAwaitingValidationDomainEvent))
.LogTrace($"Order with Id: {orderStatusChangedToAwaitingValidationDomainEvent.OrderId} has been successfully updated with " + .LogTrace($"Order with Id: {orderStatusChangedToAwaitingValidationDomainEvent.OrderId} has been successfully updated with " +
@ -38,7 +38,7 @@
var orderStatusChangedToAwaitingValidationIntegrationEvent = new OrderStatusChangedToAwaitingValidationIntegrationEvent( var orderStatusChangedToAwaitingValidationIntegrationEvent = new OrderStatusChangedToAwaitingValidationIntegrationEvent(
orderStatusChangedToAwaitingValidationDomainEvent.OrderId, orderStockList); orderStatusChangedToAwaitingValidationDomainEvent.OrderId, orderStockList);
await _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedToAwaitingValidationIntegrationEvent);
return _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedToAwaitingValidationIntegrationEvent);
} }
} }
} }

+ 2
- 2
src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderPaid/OrderStatusChangedToPaidDomainEventHandler.cs View File

@ -27,7 +27,7 @@
_orderingIntegrationEventService = orderingIntegrationEventService; _orderingIntegrationEventService = orderingIntegrationEventService;
} }
public async Task Handle(OrderStatusChangedToPaidDomainEvent orderStatusChangedToPaidDomainEvent, CancellationToken cancellationToken)
public Task Handle(OrderStatusChangedToPaidDomainEvent orderStatusChangedToPaidDomainEvent, CancellationToken cancellationToken)
{ {
_logger.CreateLogger(nameof(OrderStatusChangedToPaidDomainEventHandler)) _logger.CreateLogger(nameof(OrderStatusChangedToPaidDomainEventHandler))
.LogTrace($"Order with Id: {orderStatusChangedToPaidDomainEvent.OrderId} has been successfully updated with " + .LogTrace($"Order with Id: {orderStatusChangedToPaidDomainEvent.OrderId} has been successfully updated with " +
@ -38,7 +38,7 @@
var orderStatusChangedToPaidIntegrationEvent = new OrderStatusChangedToPaidIntegrationEvent(orderStatusChangedToPaidDomainEvent.OrderId, var orderStatusChangedToPaidIntegrationEvent = new OrderStatusChangedToPaidIntegrationEvent(orderStatusChangedToPaidDomainEvent.OrderId,
orderStockList); orderStockList);
await _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedToPaidIntegrationEvent);
return _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedToPaidIntegrationEvent);
} }
} }
} }

+ 1
- 1
src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStartedEvent/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs View File

@ -45,7 +45,7 @@ namespace Ordering.API.Application.DomainEventHandlers.OrderStartedEvent
var buyerUpdated = buyerOriginallyExisted ? _buyerRepository.Update(buyer) : _buyerRepository.Add(buyer); var buyerUpdated = buyerOriginallyExisted ? _buyerRepository.Update(buyer) : _buyerRepository.Add(buyer);
await _buyerRepository.UnitOfWork 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}."); _logger.CreateLogger(nameof(ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler)).LogTrace($"Buyer {buyerUpdated.Id} and related payment method were validated or updated for orderId: {orderStartedEvent.Order.Id}.");
} }


+ 2
- 2
src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStockConfirmed/OrderStatusChangedToStockConfirmedDomainEventHandler.cs View File

@ -26,14 +26,14 @@
_orderingIntegrationEventService = orderingIntegrationEventService; _orderingIntegrationEventService = orderingIntegrationEventService;
} }
public async Task Handle(OrderStatusChangedToStockConfirmedDomainEvent orderStatusChangedToStockConfirmedDomainEvent, CancellationToken cancellationToken)
public Task Handle(OrderStatusChangedToStockConfirmedDomainEvent orderStatusChangedToStockConfirmedDomainEvent, CancellationToken cancellationToken)
{ {
_logger.CreateLogger(nameof(OrderStatusChangedToStockConfirmedDomainEventHandler)) _logger.CreateLogger(nameof(OrderStatusChangedToStockConfirmedDomainEventHandler))
.LogTrace($"Order with Id: {orderStatusChangedToStockConfirmedDomainEvent.OrderId} has been successfully updated with " + .LogTrace($"Order with Id: {orderStatusChangedToStockConfirmedDomainEvent.OrderId} has been successfully updated with " +
$"a status order id: {OrderStatus.StockConfirmed.Id}"); $"a status order id: {OrderStatus.StockConfirmed.Id}");
var orderStatusChangedToStockConfirmedIntegrationEvent = new OrderStatusChangedToStockConfirmedIntegrationEvent(orderStatusChangedToStockConfirmedDomainEvent.OrderId); var orderStatusChangedToStockConfirmedIntegrationEvent = new OrderStatusChangedToStockConfirmedIntegrationEvent(orderStatusChangedToStockConfirmedDomainEvent.OrderId);
await _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedToStockConfirmedIntegrationEvent);
return _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedToStockConfirmedIntegrationEvent);
} }
} }
} }

+ 2
- 2
src/Services/Ordering/Ordering.API/Application/IntegrationEvents/OrderingIntegrationEventService.cs View File

@ -35,11 +35,11 @@ namespace Ordering.API.Application.IntegrationEvents
await _eventLogService.MarkEventAsPublishedAsync(evt); 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(): //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 //See: https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency
await ResilientTransaction.New(_orderingContext)
return ResilientTransaction.New(_orderingContext)
.ExecuteAsync(async () => { .ExecuteAsync(async () => {
// Achieving atomicity between original ordering database operation and the IntegrationEventLog thanks to a local transaction // Achieving atomicity between original ordering database operation and the IntegrationEventLog thanks to a local transaction
await _orderingContext.SaveChangesAsync(); await _orderingContext.SaveChangesAsync();


+ 4
- 4
src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs View File

@ -9,7 +9,7 @@
public class OrderQueries public class OrderQueries
:IOrderQueries :IOrderQueries
{ {
private string _connectionString = string.Empty;
private readonly string _connectionString = string.Empty;
public OrderQueries(string constr) public OrderQueries(string constr)
{ {
@ -21,7 +21,7 @@
{ {
using (var connection = new SqlConnection(_connectionString)) using (var connection = new SqlConnection(_connectionString))
{ {
connection.Open();
await connection.OpenAsync();
var result = await connection.QueryAsync<dynamic>( var result = await connection.QueryAsync<dynamic>(
@"select o.[Id] as ordernumber,o.OrderDate as date, o.Description as description, @"select o.[Id] as ordernumber,o.OrderDate as date, o.Description as description,
@ -46,7 +46,7 @@
{ {
using (var connection = new SqlConnection(_connectionString)) using (var connection = new SqlConnection(_connectionString))
{ {
connection.Open();
await connection.OpenAsync();
return await connection.QueryAsync<OrderSummary>(@"SELECT o.[Id] as ordernumber,o.[OrderDate] as [date],os.[Name] as [status],SUM(oi.units*oi.unitprice) as total return await connection.QueryAsync<OrderSummary>(@"SELECT o.[Id] as ordernumber,o.[OrderDate] as [date],os.[Name] as [status],SUM(oi.units*oi.unitprice) as total
FROM [ordering].[Orders] o FROM [ordering].[Orders] o
@ -61,7 +61,7 @@
{ {
using (var connection = new SqlConnection(_connectionString)) using (var connection = new SqlConnection(_connectionString))
{ {
connection.Open();
await connection.OpenAsync();
return await connection.QueryAsync<CardType>("SELECT * FROM ordering.cardtypes"); return await connection.QueryAsync<CardType>("SELECT * FROM ordering.cardtypes");
} }


+ 9
- 9
src/Services/Ordering/Ordering.API/Infrastructure/OrderingContextSeed.cs View File

@ -20,15 +20,15 @@
public class OrderingContextSeed public class OrderingContextSeed
{ {
public async Task SeedAsync(OrderingContext context, IHostingEnvironment env,IOptions<OrderingSettings> settings, ILogger<OrderingContextSeed> logger)
public Task SeedAsync(OrderingContext context, IHostingEnvironment env,IOptions<OrderingSettings> settings, ILogger<OrderingContextSeed> logger)
{ {
var policy = CreatePolicy(logger, nameof(OrderingContextSeed)); var policy = CreatePolicy(logger, nameof(OrderingContextSeed));
await policy.ExecuteAsync(async () =>
return policy.ExecuteAsync(async () =>
{ {
var useCustomizationData = settings.Value var useCustomizationData = settings.Value
.UseCustomizationData;
.UseCustomizationData;
var contentRootPath = env.ContentRootPath; var contentRootPath = env.ContentRootPath;
@ -39,18 +39,18 @@
if (!context.CardTypes.Any()) if (!context.CardTypes.Any())
{ {
context.CardTypes.AddRange(useCustomizationData
? GetCardTypesFromFile(contentRootPath, logger)
: GetPredefinedCardTypes());
await context.CardTypes.AddRangeAsync(useCustomizationData
? GetCardTypesFromFile(contentRootPath, logger)
: GetPredefinedCardTypes());
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
if (!context.OrderStatus.Any()) if (!context.OrderStatus.Any())
{ {
context.OrderStatus.AddRange(useCustomizationData
? GetOrderStatusFromFile(contentRootPath, logger)
: GetPredefinedOrderStatus());
await context.OrderStatus.AddRangeAsync(useCustomizationData
? GetOrderStatusFromFile(contentRootPath, logger)
: GetPredefinedOrderStatus());
} }
await context.SaveChangesAsync(); await context.SaveChangesAsync();


+ 2
- 2
src/Services/Ordering/Ordering.Infrastructure/MediatorExtension.cs View File

@ -8,7 +8,7 @@ namespace Ordering.Infrastructure
{ {
static class MediatorExtension 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 var domainEntities = ctx.ChangeTracker
.Entries<Entity>() .Entries<Entity>()
@ -26,7 +26,7 @@ namespace Ordering.Infrastructure
await mediator.Publish(domainEvent); await mediator.Publish(domainEvent);
}); });
await Task.WhenAll(tasks);
return Task.WhenAll(tasks);
} }
} }
} }

+ 2
- 3
src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs View File

@ -30,7 +30,6 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Infrastructure
{ {
_mediator = mediator ?? throw new ArgumentNullException(nameof(mediator)); _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
System.Diagnostics.Debug.WriteLine("OrderingContext::ctor ->" + this.GetHashCode()); 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) // After executing this line all the changes (from the Command Handler and Domain Event Handlers)
// performed throught the DbContext will be commited // performed throught the DbContext will be commited
var result = await base.SaveChangesAsync();
var result = await base.SaveChangesAsync(cancellationToken);
return true; return true;
} }
@ -70,7 +69,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Infrastructure
var optionsBuilder = new DbContextOptionsBuilder<OrderingContext>() var optionsBuilder = new DbContextOptionsBuilder<OrderingContext>()
.UseSqlServer("Server=.;Initial Catalog=Microsoft.eShopOnContainers.Services.OrderingDb;Integrated Security=true"); .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 class NoMediator : IMediator


Loading…
Cancel
Save