gpt4 book ai didi

c# - 返回有错误的响应而不是在验证管道 mediatr 3 中抛出异常

转载 作者:行者123 更新时间:2023-11-30 12:21:46 25 4
gpt4 key购买 nike

我目前正在使用 Mediatr 3 中的管道行为进行请求验证。如果发生任何故障,我遇到的所有示例都会抛出 ValidationException,而不是这样做我想返回带有错误的响应。任何人都知道如何去做?

下面是验证管道的代码:

public class ValidationPipeline<TRequest, TResponse> :
IPipelineBehavior<TRequest, TResponse> where TRequest : IRequest<TResponse>
{
private readonly IEnumerable<IValidator<TRequest>> _validators;

public ValidationPipeline(IEnumerable<IValidator<TRequest>> validators)
{
_validators = validators;
}

public Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next)
{
var failures = _validators
.Select(v => v.Validate(request))
.SelectMany(result => result.Errors)
.Where(f => f != null)
.ToList();

if (failures.Any())
{
throw new ValidationException(failures);
}

return next();
}
}

注意:我发现了这个问题Handling errors/exceptions in a mediator pipeline using CQRS?我对答案的第一个选项很感兴趣,但没有关于如何做到这一点的明确示例。

这是我的响应类:

public class ResponseBase : ValidationResult
{
public ResponseBase() : base() { }

public ResponseBase(IEnumerable<ValidationFailure> failures) : base(failures) {
}
}

我在验证管道类中添加了以下签名:

public class ValidationPipeline<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IRequest<TResponse> 
where TResponse : ResponseBase

然后我在 Handle 方法中这样做了:

var response = new ResponseBase(failures);
return Task.FromResult<TResponse>(response);

但这给了我错误“无法转换为 TResponse”。

最佳答案

几年前,我创建了通用的 Result 对象,我一直在不断改进它。很简单,查看https://github.com/martinbrabec/mbtools .

如果您同意 Result(或 Result<>)作为应用层中每个方法的返回类型,那么您可以像这样使用 ValidationBehavior:

public class ValidationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
where TRequest : IRequest<TResponse>
where TResponse : Result, new()
{
private readonly IEnumerable<IValidator<TRequest>> _validators;

public ValidationBehavior(IEnumerable<IValidator<TRequest>> validators)
{
_validators = validators;
}

public Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
{
if (_validators.Any())
{
var context = new ValidationContext(request);

List<ValidationFailure> failures = _validators
.Select(v => v.Validate(context))
.SelectMany(result => result.Errors)
.Where(f => f != null)
.ToList();

if (failures.Any())
{
TResponse response = new TResponse();

response.Set(ErrorType.NotValid, failures.Select(s => s.ErrorMessage), null);

return Task.FromResult<TResponse>(response);
}
else
{
return next();
}
}

return next();
}

}

由于您的所有处理程序都返回 Result(或基于 Result 的 Result<>),您将能够无一异常(exception)地处理所有验证错误。

关于c# - 返回有错误的响应而不是在验证管道 mediatr 3 中抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44064102/

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