List 参数的 FluentValidation

FluentValidation for List parameter

我们有一个现有的 API 端点,其签名如下(简化):

[HttpPost("api/v1/data")]
public DataSubmission SubmitData([FromBody] List<DataItem> items) {
  ...
}

public class DataItemValidator : AbstractValidator<DataItem> {
  // RuleFor(...)
}

我们已经为 DataItem 定义了一个验证器,但我们不知道如何在单个列表项上注册验证。对于列表公开为 属性 的常规输入模型,使用 RuleForEach(x => x.ListPropertyName).SetValidator(...) 很方便,但是当要验证的模型本身就是一个列表时,我们找不到可以验证项目的设置.

我们已尝试为此列表定义派生模型并为其创建验证器,如下所示:

public class DataItemList : List<DataItem> {
}

public class DataItemListValidator : AbstractValidator<DataItemList> {
  public DataItemListValidator(){
    // How to set validator for items list??
  }
}

我们是不是以错误的方式解决这个问题,还是有其他方法可以处理这种情况?

编辑:我知道 FluentValidation 不适合验证参数 (https://github.com/FluentValidation/FluentValidation/issues/337) 但我不确定这是否适用,因为它似乎有点灰色区域

(发布问题后很快找到答案)

我们可以使用派生模型和特定的 RuleForEach 语法实现验证:

public class DataListItemValidator : AbstractValidator<DataItemList> {
  public DataListItemValidator() {
    RuleForEach(x => x).SetValidator(new DataItemValidator());
  }
}

这里的关键是 (x => x) 允许迭代自身的元素。