Fluent验证的链接规则

本文关键字:规则 链接 验证 Fluent | 更新日期: 2023-09-27 18:26:41

我已经在使用最新版本的Fluent Validation,它是5.4.0.0;我需要实现的是:

想想车辆VIN,它取决于品牌Id、型号Id和制造年份。在Fluent中,当这些规则成功执行时,我是否有能力基于更多规则执行规则?

如果所有三条规则(品牌、型号和年份)都通过,我必须验证车辆vin。

我也阅读了整个文档,找不到任何实现它的参考资料

class VehicleValidator : AbstractValidator<Vehicle>
{
    public VehicleValidator()
    {             
        RuleFor(v => v.MakeId)                
            .NotEmpty()
            .WithMessage("Make Id is required") 
        RuleFor(v => v.ModelId) 
            .NotEmpty()
            .WithMessage("Model Id is required")    
        RuleFor(v => v.Year)
            .NotEqual(default(ushort))                
            .WithMessage("Year is required")    
        RuleFor(v => v)
            .MustBeAValidVehicle()
            .WithName("Vehicle")
            .Unless(v => v.IdMarca == null || v.IdModelo == null && v.Ano == default(short));
        RuleFor(v => v.VehicleVin)
            .NotEmpty()
            .WithMessage("Vehicle Vin is required")         
        //Only run this validation if the validation of MakeId, ModelId, Year and MustBeAValidVechile don't fail
        RuleFor(v => v.VehicleVin)
            .MustBeAValidVehicleVin()
            .Unless(v => v.Chassi == null || v.IdMarca == null || v.IdModelo == null || v.Ano == default(ushort));
    }
}

Fluent验证的链接规则

您可以使用CascadeMode.StopOnFirstFailure组合VIN验证规则列表,以确保只看到第一个失败。这将阻止任何额外的处理。

public class VinValidator : AbstractValidator<Vin>
{
    public VinValidator()
    {
        RuleFor(x => x.Vin)
            .Cascade(CascadeMode.StopOnFirstFailure)
            .Must(HaveValidMake).WithMessage("Invalid Make")
            .Must(HaveValidModel).WithMessage("Invalid Model")
            .Must(HaveValidYear).WithMessage("Invalid Year")
            .Must(BeValidVin).WithMessage("Invalid VIN");
    }
    private bool HaveValidMake(string vin)
    {
        return vin.Contains("make");
    }
    private bool HaveValidModel(string vin)
    {
        return vin.Contains("model");
    }
    private bool HaveValidYear(string vin)
    {
        return vin.Contains("year");
    }
    private bool BeValidVin(string vin)
    {
        return vin.Length == 17;
    }
}

以下示例演示了该行为:

"invalid" => "Invalid Make"
"xxxmakexxx" => "Invalid Model"
"xxxmakemodelxxx" => "Invalid Year"
"xxxmakemodelyearxxx" => "Invalid VIN"
"xxxmakemodelyear" => valid

更新以反映示例代码:

如果AbstractValidator中没有执行其他验证,则可以将类级属性CascadeMode设置为StopOnFirstFailure,以确保验证在第一次失败时停止(请参阅此处)。然后,您可以像在示例代码中那样将验证规则分开。

注意:在测试时,我注意到StopOnFirstFailure没有受到非必须规则的尊重。您可能需要将您的规则转换为Must,就像我上面提到的那样。

我找到了解决问题的方法。只需创建一个类,该类包含布尔属性以确定是真是假。

请参阅我在FLent验证讨论板上的帖子ValidationResultHolder-规则依赖