我将 Mediatr 4 与我的 web api 2 项目一起使用。连同 FluentValidation 和 Unity,我一直在添加管道行为来验证我的请求。
public class ValidationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
where TRequest : IRequest<TResponse>
{
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)
{
var context = new ValidationContext(request);
var failures = _validators
.Select(v => v.Validate(context))
.SelectMany(result => result.Errors)
.Where(f => f != null)
.ToList();
if (failures.Count != 0)
{
throw new ValidationException(failures);
}
return next();
}
}
这一切都很好,但我真的希望能够在一个完整的响应中返回验证。我正在努力做出这样的改变,要么让它编译,要么没有 Unity throw runtime 解决问题。
我想有类似的东西:
public class CommandResult : IResponseBase
{
private List<ValidationFailure> _validationFailures = new List<ValidationFailure>();
private readonly string _correlationid;
public CommandResult(string correlationid)
{
_correlationid = correlationid;
}
public bool IsSuccess => _validationFailures.Count == 0;
public static implicit operator bool(CommandResult result)
{
return result.IsSuccess;
}
public void AddFailures(List<ValidationFailure> results)
{
_validationFailures = results;
}
public List<ValidationFailure> Failures => _validationFailures;
public string CorrelationId => _correlationid;
}
在此基础上,我在行为中添加了一个约束,如下所示:
public class ValidationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
where TRequest : IRequest<TResponse>
where TResponse : IResponseBase, new()
但是尝试返回 CommandResult 而不是抛出异常会给我带来类型转换问题,感觉就像我把它弄得太复杂了,而且我错过了一些非常基本的东西。