gpt4 book ai didi

asp.net - 使用 CQRS 模式在 API 中返回有意义的错误

转载 作者:行者123 更新时间:2023-12-04 01:55:53 26 4
gpt4 key购买 nike

在使用 Mediatr 模式时,我发现将有意义的错误返回给 API Controller 非常具有挑战性。让我们以OrdersController.CancelOrder方法为例(src)。

在此示例中,它们“仅”返回 Ok()BadRequest() .在这种情况下,他们将如何返回诸如“此 orderid 不存在”(404)或“此订单已发货”(400)(...)之类的错误。

我们可以引入一个名为 Result 的新类。保存返回的值(如果有)和潜在的错误消息。在这种情况下,您的所有命令、查询都应返回 Result<YourModel> .我们也可以直接在 Controller 中添加代码。我无法下定决心,两种解决方案都有优点和缺点。

你怎么看?

谢谢
塞布

最佳答案

这正是我倾向于使用 Mediatr 的方式。
返回一个包装类。

如果我们以 eShopOnContainers 为例 CancelOrder例如,我有命令,返回 CancelOrderCommandResult

public class CancelOrderCommand : IRequest<CancelOrderCommandResult>
{ }
CancelOrderCommandResult可能是这样的:
public class CancelOrderCommandResult
{
public CancelOrderCommandResult(IEnumerable<Error> errors)
{
Success = false;
Errors = errors;
}

public CancelOrderCommandResult(bool success)
{
Success = success;
}

public bool Success {get; set;}

public IEnumerable<Error> Errors {get; set;}
}

我省略了 Error类,但它可能只是包含错误信息、错误代码等的 POCO...

然后我们的处理程序变成
public class CancelOrderCommandHandler : IRequestHandler<CancelOrderCommand, CancelOrderCommandResult>
{
private readonly IOrderRepository _orderRepository;

public CancelOrderCommandHandler(IOrderRepository orderRepository)
{
_orderRepository = orderRepository;
}

public async Task<bool> Handle(CancelOrderCommand command, CancellationToken cancellationToken)
{
var orderToUpdate = await _orderRepository.GetAsync(command.OrderNumber);

if(orderToUpdate == null)
{
return false;
}

try
{
orderToUpdate.SetCancelledStatus();
await _orderRepository.UnitOfWork.SaveEntitiesAsync();

//iff success, return true
return new CancelOrderCommandResult(true);
}
catch (Exception ex)
{
var errors = MapErrorsFromException(ex);
return new CancelOrderCommandResult(errors)
}
}
}

再次, MapErrorsFromException为简洁起见省略,但您甚至可以将其作为依赖项注入(inject)。

在您的 Controller 中,当您调用 _mediator.Send你现在取回 CancelOrderCommandResult - 如果 .Success是真的,像以前一样返回 200。

否则,您会有一系列错误 - 您可以使用这些错误来决定返回什么 - 400、500 等......

关于asp.net - 使用 CQRS 模式在 API 中返回有意义的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50712308/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com