我有这个验证器。
public class InputValidator : AbstractValidator<InputData>
{
public InputValidator()
{
RuleFor(inputData => inputData.Ucl).GreaterThan(0).....;
RuleForEach(inputData => inputData.Loads).ChildRules(inputData => {
inputData.RuleFor(load => load.Position).GreaterThan(0).....);
});
... etc
然而:"位置"(在每个负载中)必须小于Ucl(在InputData中)。Position(在每次加载中)也必须小于Ucl(在InputData中).我如何为这样的关系(父参数与子参数)制定一个规则?
我觉得没有一个很好的方法来做内联。子规则不允许你传入父对象。Must
而且我认为 Custom
(通过 context.ParentContext.InstanceToValidate
maybe)将允许您添加涉及父项和子项的规则,但这些规则将针对集合而不是每个项目。更好的方法,也是我通常会做的方法,是为你的 Load
实体。
public class LoadValidator : AbstractValidator<Load>
{
public LoadValidator(InputData inputData)
{
RuleFor(load => load.Position)
.GreaterThan(0).WithMessage("Position must be greater than 0")
.LessThan(inputData.Ucl).WithMessage("Position must be less than Ucl");
}
}
这样就可以重复使用了,测试起来也方便多了。然后使用 SetValidator
来使用它。
public class InputDataValidator : AbstractValidator<InputData>
{
public InputDataValidator()
{
RuleFor(inputData => inputData.Ucl)
.GreaterThan(0).WithMessage("Ucl must be greater than 0");
RuleForEach(inputData => inputData.Loads)
.SetValidator(inputData => new LoadValidator(inputData));
}
}
可重复使用的属性验证器 可能是另一种方法,但对我来说,必须是一个相当高级别的通用案例,才会去实施。