FluentValidation规则链接不会在第一次失败时停止

我有一个模特:

public class DTO { public int[] StatementItems { get; set; } } 

我要validation的是:

  1. StatementItems不为null
  2. StatementItems不为空
  3. StatementItems不包含任何重复的ID

我创建的validation规则链是:

 RuleFor(x => x.StatementItems).NotNull().NotEmpty().Must(x => x.Distinct().Count() == x.Count()); 

我有一个测试:

 _validator.ShouldHaveValidationErrorFor(x => x.StatementItems, null as int[]); 

当我运行测试传递一个空值时,我希望它在链的第一个规则( NotNull() )上失败并停在那里。 但是,它抱怨Must()使用的lamda值为null。

如果NotNull()失败,我认为不应该运行Must() ,这是错误的吗? 如果是这样,该规则应如何编写?

谢谢

尽管@ NPras的回答确实为我提供了一个解决方案,但我不喜欢我正在复制NotNull规则的事实。 在对FluentValidation进行了一些研究后,我使用DependentRules实现了它:

 RuleFor(x => x.StatementItems).NotNull().NotEmpty() .DependentRules(d => d.RuleFor(x => x.StatementItems).Must(x => x.Distinct().Count() == x.Count()) ); 

所以现在只有在前两个规则有效时才会触发Must条件。

我没有在FluentValidation文档中看到它实际上保证了短路。

如果你查看它的来源:

 public virtual ValidationResult Validate(ValidationContext context) { ... var failures = nestedValidators.SelectMany(x => x.Validate(context)); return new ValidationResult(failures); } 

它将运行* all *validation器(使用SelectMany() )并返回错误列表。

您唯一的选择似乎是强制检查您的Must规则。

 .Must(x => x!= null && x.Distinct().Count() == x.Count()) //or, fluently: .Must(x => x.Distinct().Count() == x.Count()).When(x => x! = null) 

编辑:我打算建议,因为Validate()是虚拟的,你可以在validation器中覆盖它以使其短路。 但后来我意识到nestedValidators列表是私有的。 所以是的,没有……