Refactor ICommand

Rename DuplicateCommand to ExistingCommand
This commit is contained in:
domenkogler 2018-07-02 23:20:23 +02:00
parent f60d161ce7
commit f013cb1dff
9 changed files with 47 additions and 42 deletions

View File

@ -7,13 +7,13 @@ using Microsoft.Extensions.Logging;
namespace Ordering.API.Infrastructure.Behaviors
{
public class DuplicateCommandBehavior<TCommand, TResponse> : IPipelineBehavior<TCommand, TResponse>
public class ExistingCommandBehavior<TCommand, TResponse> : IPipelineBehavior<TCommand, TResponse>
where TCommand : ICommand
{
private readonly IMediator _mediator;
private readonly IRequestManager _requestManager;
public DuplicateCommandBehavior(IMediator mediator, IRequestManager requestManager)
public ExistingCommandBehavior(IMediator mediator, IRequestManager requestManager)
{
_mediator = mediator;
_requestManager = requestManager;
@ -24,8 +24,8 @@ namespace Ordering.API.Infrastructure.Behaviors
var alreadyExists = await _requestManager.ExistAsync(command.CommandId);
if (alreadyExists)
{
var duplicateCommand = new DuplicateCommandResponse<TCommand, TResponse>.DuplicateCommand<TCommand>(command);
return await _mediator.Send(duplicateCommand, cancellationToken);
var existingCommand = new ExistingCommandResponse<TCommand, TResponse>.ExistingCommand(command);
return await _mediator.Send(existingCommand, cancellationToken);
}
await _requestManager.CreateRequestForCommandAsync<TCommand>(command.CommandId);

View File

@ -8,7 +8,7 @@ using Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands;
namespace Ordering.API.Application.Commands
{
public class CancelOrderCommand : ICommand, IRequest<bool>
public class CancelOrderCommand : ICommand<bool>
{
public Guid CommandId { get; set; }

View File

@ -38,9 +38,9 @@ namespace Ordering.API.Application.Commands
// Use for Idempotency in Command process
public class CancelOrderDuplicateCommand : DuplicateCommandResponse<CancelOrderCommand, bool>
public class CancelOrderExistingCommand : ExistingCommandResponse<CancelOrderCommand, bool>
{
protected override Task<bool> CreateResponseForDuplicateCommand(CancelOrderCommand command)
protected override Task<bool> CreateResponseForExistingCommand(CancelOrderCommand command)
{
// Ignore duplicate requests for processing order.
return Task.FromResult(true);

View File

@ -47,9 +47,9 @@
// Use for Idempotency in Command process
public class CreateOrderDuplicateCommand : DuplicateCommandResponse<CreateOrderCommand, bool>
public class CreateOrderExistingCommand : ExistingCommandResponse<CreateOrderCommand, bool>
{
protected override Task<bool> CreateResponseForDuplicateCommand(CreateOrderCommand command)
protected override Task<bool> CreateResponseForExistingCommand(CreateOrderCommand command)
{
// Ignore duplicate requests for creating order.
return Task.FromResult(true);

View File

@ -1,30 +0,0 @@
using System.Threading;
using System.Threading.Tasks;
using MediatR;
namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands
{
public abstract class DuplicateCommandResponse<TCommand, TResponse> : IRequestHandler<DuplicateCommandResponse<TCommand, TResponse>.DuplicateCommand<TCommand>, TResponse>
{
public class DuplicateCommand<TCommand> : IRequest<TResponse>
{
public DuplicateCommand(TCommand command)
{
Command = command;
}
public TCommand Command { get; }
}
/// <summary>
/// Creates the result value to return if a previous request was found
/// </summary>
/// <returns></returns>
protected abstract Task<TResponse> CreateResponseForDuplicateCommand(TCommand command);
Task<TResponse> IRequestHandler<DuplicateCommand<TCommand>, TResponse>.Handle(DuplicateCommand<TCommand> request, CancellationToken cancellationToken)
{
return CreateResponseForDuplicateCommand(request.Command);
}
}
}

View File

@ -0,0 +1,30 @@
using System.Threading;
using System.Threading.Tasks;
using MediatR;
namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands
{
public abstract class ExistingCommandResponse<TCommand, TResponse> : IRequestHandler<ExistingCommandResponse<TCommand, TResponse>.ExistingCommand, TResponse>
{
public class ExistingCommand : IRequest<TResponse>
{
public ExistingCommand(TCommand command)
{
Command = command;
}
public TCommand Command { get; }
}
/// <summary>
/// Creates the result value to return if a previous request was found
/// </summary>
/// <returns></returns>
protected abstract Task<TResponse> CreateResponseForExistingCommand(TCommand command);
Task<TResponse> IRequestHandler<ExistingCommand, TResponse>.Handle(ExistingCommand request, CancellationToken cancellationToken)
{
return CreateResponseForExistingCommand(request.Command);
}
}
}

View File

@ -1,4 +1,5 @@
using System;
using MediatR;
namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands
{
@ -6,4 +7,8 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands
{
Guid CommandId { get; }
}
public interface ICommand<out TResponse> : ICommand, IRequest<TResponse>
{
}
}

View File

@ -38,9 +38,9 @@ namespace Ordering.API.Application.Commands
// Use for Idempotency in Command process
public class ShipOrderDuplicateCommand : DuplicateCommandResponse<ShipOrderCommand, bool>
public class ShipOrderExistingCommand : ExistingCommandResponse<ShipOrderCommand, bool>
{
protected override Task<bool> CreateResponseForDuplicateCommand(ShipOrderCommand command)
protected override Task<bool> CreateResponseForExistingCommand(ShipOrderCommand command)
{
// Ignore duplicate requests for creating order.
return Task.FromResult(true);

View File

@ -42,7 +42,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Infrastructure.Autof
builder.RegisterGeneric(typeof(LoggingBehavior<,>)).As(typeof(IPipelineBehavior<,>));
builder.RegisterGeneric(typeof(ValidatorBehavior<,>)).As(typeof(IPipelineBehavior<,>));
builder.RegisterGeneric(typeof(DuplicateCommandBehavior<,>)).As(typeof(IPipelineBehavior<,>));
builder.RegisterGeneric(typeof(ExistingCommandBehavior<,>)).As(typeof(IPipelineBehavior<,>));
}
}