gpt4 book ai didi

c# - FluentValidation 使用手动验证的隐式子验证

转载 作者:行者123 更新时间:2023-12-04 15:33:55 25 4
gpt4 key购买 nike

Reading the documentation在 .NET Core 中,您似乎可以使用以下方法进行隐式子属性验证:

services.AddMvc().AddFluentValidation(fv => {
fv.ImplicitlyValidateChildProperties = true;
});

不幸的是,我没有直接使用 MVC,所以我必须调用 Validate我自己(IValidator<T> 实例是我自己在 Scrutor 注册的)。是否有类似的设置用于手动验证嵌套字段以及顶级字段(使用 .NET Core DI)?

最佳答案

如果您查看 FluentValidation 源代码,您会注意到 ImplicitlyValidateChildProperties 选项使用 Asp.Net 机制来验证嵌套属性,因此它不适用于手动验证。

您可以编写使用反射和 IValidatorFactory 服务的帮助程序或扩展方法来执行嵌套验证:

public static async Task<ValidationResult> ValidateImplicitAsync<TReq>(this TReq request, IValidatorFactory factory)
where TReq: class
{
var result = new ValidationResult();
await ValidateRecursively(request, factory, result);
return result;
}

static async Task ValidateRecursively(
object obj,
IValidatorFactory factory,
ValidationResult result)
{
if(obj == null) { return; }
Type t = obj.GetType();
IValidator validator = factory.GetValidator(t);
if(validator == null) { return; }
ValidationResult r = await validator.ValidateAsync(new ValidationContext<object>(obj));
foreach(var error in r.Errors)
{
result.Errors.Add(error);
}
foreach(var prop in t.GetProperties())
{
object childValue = prop.GetValue(obj, null);
await ValidateRecursively(childValue, factory, result);
}
}

然后你可以这样调用它:

public class MyService {
readonly IValidatorFactory factory;

public MyService(IValidatorFactory factory){
this.factory = factory;
}

public async Task Handle(MyModel model){
ValidationResult validationResult = await model.ValidateImplicitAsync(factory);
// ... etc...
}
}

关于c# - FluentValidation 使用手动验证的隐式子验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60415057/

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