【发布时间】:2019-01-09 06:08:54
【问题描述】:
我有一个 MediatR 管道行为,用于使用 FluentValidation 库验证命令。我见过很多例子,你从行为中抛出一个 ValidationException,这对我来说很好。但是在我的场景中,我想用验证错误更新我的响应对象。
我能够构建和运行以下代码。当我在 if 语句中设置断点时,CommandResponse 按预期构造了验证错误 - 但是当原始调用者收到响应时,它为空:
public class RequestValidationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IRequest<TResponse>
{
private readonly IEnumerable<IValidator<TRequest>> _validators;
public RequestValidationBehavior(IEnumerable<IValidator<TRequest>> validators)
{
_validators = validators;
}
public Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
{
var context = new ValidationContext(request);
// Run the associated validator against the request
var failures = _validators
.Select(v => v.Validate(context))
.SelectMany(result => result.Errors)
.Where(f => f != null)
.ToList();
if(failures.Count != 0)
{
var commandResponse = new CommandResponse(failures) { isSuccess = false };
return commandResponse as Task<TResponse>;
}
else
{
return next();
}
}
}
我认为这与我尝试将其转换为任务有关 - 但没有这个我会得到编译器错误。如果验证通过,我将返回与我的命令处理程序相同的类型,所以我不知道为什么它返回预期响应的空实例。我觉得有更好的方法来处理这个问题,但我尝试了许多变体都无济于事。有什么建议?有没有更好的模式可以使用?我希望将其保留在管道中,因为它会被大量重复使用。
【问题讨论】:
-
Handle 方法应该是
async吗?然后你就不需要演员了 Task
标签: c# asp.net-core cqrs fluentvalidation mediatr