Skip to content

Commit ebf9822

Browse files
Refactored code related to Idempotent CommandHandlers
1 parent c3d9deb commit ebf9822

6 files changed

Lines changed: 21 additions & 15 deletions

File tree

src/Services/Ordering/Ordering.API/Application/Commands/CancelOrderCommandHandler.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99

1010
namespace Ordering.API.Application.Commands
1111
{
12-
public class CancelOrderCommandIdentifiedHandler : IdentifierCommandHandler<CancelOrderCommand, bool>
12+
// Use for Idempotency in Command process
13+
public class CancelOrderCommandIdempotentHandler : IdentifiedCommandHandler<CancelOrderCommand, bool>
1314
{
14-
public CancelOrderCommandIdentifiedHandler(IMediator mediator, IRequestManager requestManager) : base(mediator, requestManager)
15+
public CancelOrderCommandIdempotentHandler(IMediator mediator, IRequestManager requestManager) : base(mediator, requestManager)
1516
{
1617
}
1718

@@ -21,6 +22,7 @@ protected override bool CreateResultForDuplicateRequest()
2122
}
2223
}
2324

25+
// Regular CommandHandler
2426
public class CancelOrderCommandHandler : IAsyncRequestHandler<CancelOrderCommand, bool>
2527
{
2628
private readonly IOrderRepository _orderRepository;

src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
using System;
88
using System.Threading.Tasks;
99

10-
11-
public class CreateOrderCommandIdentifiedHandler : IdentifierCommandHandler<CreateOrderCommand, bool>
10+
// Use for Idempotency in Command process
11+
public class CreateOrderCommandIdempotentHandler : IdentifiedCommandHandler<CreateOrderCommand, bool>
1212
{
13-
public CreateOrderCommandIdentifiedHandler(IMediator mediator, IRequestManager requestManager) : base(mediator, requestManager)
13+
public CreateOrderCommandIdempotentHandler(IMediator mediator, IRequestManager requestManager) : base(mediator, requestManager)
1414
{
1515
}
1616

@@ -20,6 +20,7 @@ protected override bool CreateResultForDuplicateRequest()
2020
}
2121
}
2222

23+
// Regular CommandHandler
2324
public class CreateOrderCommandHandler
2425
: IAsyncRequestHandler<CreateOrderCommand, bool>
2526
{

src/Services/Ordering/Ordering.API/Application/Commands/IdentifierCommandHandler.cs renamed to src/Services/Ordering/Ordering.API/Application/Commands/IdentifiedCommandHandler.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands
1010
/// </summary>
1111
/// <typeparam name="T">Type of the command handler that performs the operation if request is not duplicated</typeparam>
1212
/// <typeparam name="R">Return value of the inner command handler</typeparam>
13-
public class IdentifierCommandHandler<T, R> : IAsyncRequestHandler<IdentifiedCommand<T, R>, R>
13+
public class IdentifiedCommandHandler<T, R> : IAsyncRequestHandler<IdentifiedCommand<T, R>, R>
1414
where T : IRequest<R>
1515
{
1616
private readonly IMediator _mediator;
1717
private readonly IRequestManager _requestManager;
1818

19-
public IdentifierCommandHandler(IMediator mediator, IRequestManager requestManager)
19+
public IdentifiedCommandHandler(IMediator mediator, IRequestManager requestManager)
2020
{
2121
_mediator = mediator;
2222
_requestManager = requestManager;
@@ -48,6 +48,7 @@ public async Task<R> Handle(IdentifiedCommand<T, R> message)
4848
{
4949
await _requestManager.CreateRequestForCommandAsync<T>(message.Id);
5050

51+
// Send the embeded business command to mediator so it runs its related CommandHandler
5152
var result = await _mediator.Send(message.Command);
5253

5354
return result;

src/Services/Ordering/Ordering.API/Application/Commands/ShipOrderCommandHandler.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66

77
namespace Ordering.API.Application.Commands
88
{
9-
public class ShipOrderCommandIdentifiedHandler : IdentifierCommandHandler<ShipOrderCommand, bool>
9+
// Use for Idempotency in Command process
10+
public class ShipOrderCommandIdempotentHandler : IdentifiedCommandHandler<ShipOrderCommand, bool>
1011
{
11-
public ShipOrderCommandIdentifiedHandler(IMediator mediator, IRequestManager requestManager) : base(mediator, requestManager)
12+
public ShipOrderCommandIdempotentHandler(IMediator mediator, IRequestManager requestManager) : base(mediator, requestManager)
1213
{
1314
}
1415

@@ -18,6 +19,7 @@ protected override bool CreateResultForDuplicateRequest()
1819
}
1920
}
2021

22+
// Regular CommandHandler
2123
public class ShipOrderCommandHandler : IAsyncRequestHandler<ShipOrderCommand, bool>
2224
{
2325
private readonly IOrderRepository _orderRepository;

src/Services/Ordering/Ordering.API/Application/Validations/IdentifierCommandValidator.cs renamed to src/Services/Ordering/Ordering.API/Application/Validations/IdentifiedCommandValidator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33

44
namespace Ordering.API.Application.Validations
55
{
6-
public class IdentifierCommandValidator : AbstractValidator<IdentifiedCommand<CreateOrderCommand,bool>>
6+
public class IdentifiedCommandValidator : AbstractValidator<IdentifiedCommand<CreateOrderCommand,bool>>
77
{
8-
public IdentifierCommandValidator()
8+
public IdentifiedCommandValidator()
99
{
1010
RuleFor(command => command.Id).NotEmpty();
1111
}

test/Services/UnitTest/Ordering/Application/IdentifierCommandHandlerTest.cs renamed to test/Services/UnitTest/Ordering/Application/IdentifiedCommandHandlerTest.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ namespace UnitTest.Ordering.Application
1313
using System.Collections.Generic;
1414
using System.Threading.Tasks;
1515
using Xunit;
16-
public class IdentifierCommandHandlerTest
16+
public class IdentifiedCommandHandlerTest
1717
{
1818
private readonly Mock<IRequestManager> _requestManager;
1919
private readonly Mock<IMediator> _mediator;
2020

21-
public IdentifierCommandHandlerTest()
21+
public IdentifiedCommandHandlerTest()
2222
{
2323
_requestManager = new Mock<IRequestManager>();
2424
_mediator = new Mock<IMediator>();
@@ -38,7 +38,7 @@ public async Task Handler_sends_command_when_order_no_exists()
3838
.Returns(Task.FromResult(true));
3939

4040
//Act
41-
var handler = new IdentifierCommandHandler<CreateOrderCommand, bool>(_mediator.Object, _requestManager.Object);
41+
var handler = new IdentifiedCommandHandler<CreateOrderCommand, bool>(_mediator.Object, _requestManager.Object);
4242
var result = await handler.Handle(fakeOrderCmd);
4343

4444
//Assert
@@ -60,7 +60,7 @@ public async Task Handler_sends_no_command_when_order_already_exists()
6060
.Returns(Task.FromResult(true));
6161

6262
//Act
63-
var handler = new IdentifierCommandHandler<CreateOrderCommand, bool>(_mediator.Object, _requestManager.Object);
63+
var handler = new IdentifiedCommandHandler<CreateOrderCommand, bool>(_mediator.Object, _requestManager.Object);
6464
var result = await handler.Handle(fakeOrderCmd);
6565

6666
//Assert

0 commit comments

Comments
 (0)