Browse Source

Refactored code related to Idempotent CommandHandlers

pull/417/head
Cesar De la Torre 7 years ago
parent
commit
ebf9822af3
6 changed files with 21 additions and 15 deletions
  1. +4
    -2
      src/Services/Ordering/Ordering.API/Application/Commands/CancelOrderCommandHandler.cs
  2. +4
    -3
      src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs
  3. +3
    -2
      src/Services/Ordering/Ordering.API/Application/Commands/IdentifiedCommandHandler.cs
  4. +4
    -2
      src/Services/Ordering/Ordering.API/Application/Commands/ShipOrderCommandHandler.cs
  5. +2
    -2
      src/Services/Ordering/Ordering.API/Application/Validations/IdentifiedCommandValidator.cs
  6. +4
    -4
      test/Services/UnitTest/Ordering/Application/IdentifiedCommandHandlerTest.cs

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

@ -9,9 +9,10 @@ using System.Threading.Tasks;
namespace Ordering.API.Application.Commands namespace Ordering.API.Application.Commands
{ {
public class CancelOrderCommandIdentifiedHandler : IdentifierCommandHandler<CancelOrderCommand, bool>
// Use for Idempotency in Command process
public class CancelOrderCommandIdempotentHandler : IdentifiedCommandHandler<CancelOrderCommand, bool>
{ {
public CancelOrderCommandIdentifiedHandler(IMediator mediator, IRequestManager requestManager) : base(mediator, requestManager)
public CancelOrderCommandIdempotentHandler(IMediator mediator, IRequestManager requestManager) : base(mediator, requestManager)
{ {
} }
@ -21,6 +22,7 @@ namespace Ordering.API.Application.Commands
} }
} }
// Regular CommandHandler
public class CancelOrderCommandHandler : IAsyncRequestHandler<CancelOrderCommand, bool> public class CancelOrderCommandHandler : IAsyncRequestHandler<CancelOrderCommand, bool>
{ {
private readonly IOrderRepository _orderRepository; private readonly IOrderRepository _orderRepository;


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

@ -7,10 +7,10 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
public class CreateOrderCommandIdentifiedHandler : IdentifierCommandHandler<CreateOrderCommand, bool>
// Use for Idempotency in Command process
public class CreateOrderCommandIdempotentHandler : IdentifiedCommandHandler<CreateOrderCommand, bool>
{ {
public CreateOrderCommandIdentifiedHandler(IMediator mediator, IRequestManager requestManager) : base(mediator, requestManager)
public CreateOrderCommandIdempotentHandler(IMediator mediator, IRequestManager requestManager) : base(mediator, requestManager)
{ {
} }
@ -20,6 +20,7 @@
} }
} }
// Regular CommandHandler
public class CreateOrderCommandHandler public class CreateOrderCommandHandler
: IAsyncRequestHandler<CreateOrderCommand, bool> : IAsyncRequestHandler<CreateOrderCommand, bool>
{ {


src/Services/Ordering/Ordering.API/Application/Commands/IdentifierCommandHandler.cs → src/Services/Ordering/Ordering.API/Application/Commands/IdentifiedCommandHandler.cs View File

@ -10,13 +10,13 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands
/// </summary> /// </summary>
/// <typeparam name="T">Type of the command handler that performs the operation if request is not duplicated</typeparam> /// <typeparam name="T">Type of the command handler that performs the operation if request is not duplicated</typeparam>
/// <typeparam name="R">Return value of the inner command handler</typeparam> /// <typeparam name="R">Return value of the inner command handler</typeparam>
public class IdentifierCommandHandler<T, R> : IAsyncRequestHandler<IdentifiedCommand<T, R>, R>
public class IdentifiedCommandHandler<T, R> : IAsyncRequestHandler<IdentifiedCommand<T, R>, R>
where T : IRequest<R> where T : IRequest<R>
{ {
private readonly IMediator _mediator; private readonly IMediator _mediator;
private readonly IRequestManager _requestManager; private readonly IRequestManager _requestManager;
public IdentifierCommandHandler(IMediator mediator, IRequestManager requestManager)
public IdentifiedCommandHandler(IMediator mediator, IRequestManager requestManager)
{ {
_mediator = mediator; _mediator = mediator;
_requestManager = requestManager; _requestManager = requestManager;
@ -48,6 +48,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands
{ {
await _requestManager.CreateRequestForCommandAsync<T>(message.Id); await _requestManager.CreateRequestForCommandAsync<T>(message.Id);
// Send the embeded business command to mediator so it runs its related CommandHandler
var result = await _mediator.Send(message.Command); var result = await _mediator.Send(message.Command);
return result; return result;

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

@ -6,9 +6,10 @@ using System.Threading.Tasks;
namespace Ordering.API.Application.Commands namespace Ordering.API.Application.Commands
{ {
public class ShipOrderCommandIdentifiedHandler : IdentifierCommandHandler<ShipOrderCommand, bool>
// Use for Idempotency in Command process
public class ShipOrderCommandIdempotentHandler : IdentifiedCommandHandler<ShipOrderCommand, bool>
{ {
public ShipOrderCommandIdentifiedHandler(IMediator mediator, IRequestManager requestManager) : base(mediator, requestManager)
public ShipOrderCommandIdempotentHandler(IMediator mediator, IRequestManager requestManager) : base(mediator, requestManager)
{ {
} }
@ -18,6 +19,7 @@ namespace Ordering.API.Application.Commands
} }
} }
// Regular CommandHandler
public class ShipOrderCommandHandler : IAsyncRequestHandler<ShipOrderCommand, bool> public class ShipOrderCommandHandler : IAsyncRequestHandler<ShipOrderCommand, bool>
{ {
private readonly IOrderRepository _orderRepository; private readonly IOrderRepository _orderRepository;


src/Services/Ordering/Ordering.API/Application/Validations/IdentifierCommandValidator.cs → src/Services/Ordering/Ordering.API/Application/Validations/IdentifiedCommandValidator.cs View File

@ -3,9 +3,9 @@ using Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands;
namespace Ordering.API.Application.Validations namespace Ordering.API.Application.Validations
{ {
public class IdentifierCommandValidator : AbstractValidator<IdentifiedCommand<CreateOrderCommand,bool>>
public class IdentifiedCommandValidator : AbstractValidator<IdentifiedCommand<CreateOrderCommand,bool>>
{ {
public IdentifierCommandValidator()
public IdentifiedCommandValidator()
{ {
RuleFor(command => command.Id).NotEmpty(); RuleFor(command => command.Id).NotEmpty();
} }

test/Services/UnitTest/Ordering/Application/IdentifierCommandHandlerTest.cs → test/Services/UnitTest/Ordering/Application/IdentifiedCommandHandlerTest.cs View File

@ -13,12 +13,12 @@ namespace UnitTest.Ordering.Application
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Xunit; using Xunit;
public class IdentifierCommandHandlerTest
public class IdentifiedCommandHandlerTest
{ {
private readonly Mock<IRequestManager> _requestManager; private readonly Mock<IRequestManager> _requestManager;
private readonly Mock<IMediator> _mediator; private readonly Mock<IMediator> _mediator;
public IdentifierCommandHandlerTest()
public IdentifiedCommandHandlerTest()
{ {
_requestManager = new Mock<IRequestManager>(); _requestManager = new Mock<IRequestManager>();
_mediator = new Mock<IMediator>(); _mediator = new Mock<IMediator>();
@ -38,7 +38,7 @@ namespace UnitTest.Ordering.Application
.Returns(Task.FromResult(true)); .Returns(Task.FromResult(true));
//Act //Act
var handler = new IdentifierCommandHandler<CreateOrderCommand, bool>(_mediator.Object, _requestManager.Object);
var handler = new IdentifiedCommandHandler<CreateOrderCommand, bool>(_mediator.Object, _requestManager.Object);
var result = await handler.Handle(fakeOrderCmd); var result = await handler.Handle(fakeOrderCmd);
//Assert //Assert
@ -60,7 +60,7 @@ namespace UnitTest.Ordering.Application
.Returns(Task.FromResult(true)); .Returns(Task.FromResult(true));
//Act //Act
var handler = new IdentifierCommandHandler<CreateOrderCommand, bool>(_mediator.Object, _requestManager.Object);
var handler = new IdentifiedCommandHandler<CreateOrderCommand, bool>(_mediator.Object, _requestManager.Object);
var result = await handler.Handle(fakeOrderCmd); var result = await handler.Handle(fakeOrderCmd);
//Assert //Assert

Loading…
Cancel
Save