gpt4 book ai didi

c# - FluentValidation - 无代码重复的预验证/条件验证

转载 作者:太空狗 更新时间:2023-10-29 20:26:31 29 4
gpt4 key购买 nike

我正在尝试创建验证,它能够有两个组并在第一次失败时阻止第二次验证(它包含许多规则)。

现在我确实在内部创建了一个私有(private)的“BasicValidation”类,并在“主验证器”中这样做:

RuleFor(m => m).SetValidator(new BasicValidation()).DependentRules(() => {
//Complex validation
RuleFor(m => m.IdOfSthInDb)
.MustAsync(ItemMustExists)
.WithMessage("Item does not exist.");
});

它可以解决问题,但我想避免为每个模型创建“BasicValidation”。

最佳答案

在我之前的回答中,我误解了这个问题。主要目标是避免不同验证器中的代码重复。经过一番调查,我找到了符合您要求的解决方案。假设你有模型:

public abstract class BaseModel
{
public string BaseProperty1 { get; set; }
public string BaseProperty2 { get; set; }
}

public class ChildModel : BaseModel
{
public int IdOfSthInDb { get; set; }
}

您必须为基础模型创建验证器(它将被进一步使用):

class InternalBaseModelValidator : AbstractValidator<BaseModel>
{
public InternalBaseModelValidator()
{
RuleFor(x => x.BaseProperty1).NotEmpty().WithMessage("Property 1 is empty");
RuleFor(x => x.BaseProperty2).NotEmpty().WithMessage("Property 2 is empty");
}
}

然后您可以使用 FluentValidation 的新功能,称为 PreValidate :

public class BaseModelValidator<T>: AbstractValidator<T> where T : BaseModel
{
// necessary for reusing base rules
private readonly InternalBaseModelValidator preValidator;

protected BaseModelValidator()
{
preValidator = new InternalBaseModelValidator();
}

protected override bool PreValidate(ValidationContext<T> context, ValidationResult result)
{
var preValidationResult = preValidator.Validate(context.InstanceToValidate);
if (preValidationResult.IsValid)
{
return true;
}

foreach(var error in preValidationResult.Errors)
{
result.Errors.Add(new ValidationFailure(error.PropertyName, error.ErrorMessage, error.AttemptedValue));
}

return false;
}
}

为所有基础模型创建验证器后,您可以从它继承以进行 ChildModel 验证:

public class ChildModelValidator : BaseModelValidator<ChildModel>
{
public ChildModelValidator()
: base()
{
RuleFor(x => x.IdOfSthInDb)
.MustAsync(ItemMustExists)
.WithMessage("Item does not exist.");
}

private Task<bool> ItemMustExists(int arg1, CancellationToken arg2)
{
return Task.FromResult(false); // some logic here
}
}

就是这样!

关于c# - FluentValidation - 无代码重复的预验证/条件验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52180324/

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