gpt4 book ai didi

c# - Mediatr 行为管道中的验证

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

我在我的 web api 2 项目中使用 Mediatr 4。与 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 而不是抛出异常给我带来了类型转换问题,感觉我把它弄得太复杂了而且我遗漏了一些非常基本的东西。

最佳答案

两种类型的验证(至少)

  1. 请求数据验证 - 验证收到的 HTTP 请求是否包含格式正确的所需数据。前任。 电子邮件字段是必需的,并且应该是有效的电子邮件地址**

  2. 特定于域的验证 - 验证 Command 尝试应用于当前应用程序状态的修改在域预期中是否有效。前任。 电子邮件 必须是唯一的。 电子邮件不应被列入黑名单

第一种类型的验证进入 ActionFilter

第二种类型的验证进入IPipelineBehavior

Domain Command Patterns - Validation

关于c# - Mediatr 行为管道中的验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48321330/

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