FluentValidation:在子集合规则中使用父 属性 值
FluentValidation: Using a parent property value in a child collection rule
我有这个验证器:
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 中)。
我如何为这种关系制定规则(父参数与子参数)?
我认为没有内联的好方法。子规则不允许您传入父对象。 Must
并且我认为 Custom
(可能通过 context.ParentContext.InstanceToValidate
)将允许您添加涉及父项和子项的规则,但规则将针对集合而不是每个物品。更好的方法,也是我通常的做法是为您的 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));
}
}
Reusable property validators 可能是另一种方法,但对我来说,它必须是一个相当高的 level/generic 案例才能实施一个。
我有这个验证器:
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 中)。 我如何为这种关系制定规则(父参数与子参数)?
我认为没有内联的好方法。子规则不允许您传入父对象。 Must
并且我认为 Custom
(可能通过 context.ParentContext.InstanceToValidate
)将允许您添加涉及父项和子项的规则,但规则将针对集合而不是每个物品。更好的方法,也是我通常的做法是为您的 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));
}
}
Reusable property validators 可能是另一种方法,但对我来说,它必须是一个相当高的 level/generic 案例才能实施一个。