我正在使用 FluentValidation 验证对象内部的集合,将集合项的元素与父对象的元素进行比较。
目标输出是接收集合中每个失败项目的 ValidationFailures,而不仅仅是使集合失败。
我有一个软件订单,其中包含软件项目列表。如果订单是遗留系统,则所选软件只能是遗留软件,反之亦然,非遗留系统只能有非遗留软件。
我的模型:
public class SoftwareOrder
{
public bool IsLegacySystem;
public List<SoftwareItem> Software;
(...other fields...)
}
public class SoftwareItem
{
public bool Selected;
public bool IsLegacySoftware;
public int SoftwareId;
}
验证器:
public class SoftwareOrderValidator : AbstractValidator<SoftwareOrder>
{
public SoftwareOrderValidator()
{
(..other rules..)
When(order => order.IsLegacySystem == true, () =>
{
RuleForEach(order => order.SoftwareItem)
.SetValidator(new SoftwareItemValidator(true));
});
When(order => order.IsLegacySystem == false, () =>
{
RuleForEach(order => order.SoftwareItem)
.SetValidator(new SoftwareItemValidator(false));
});
}
}
public class SoftwareItemValidator : AbstractValidator<SoftwareItem>
{
public SoftwareItemValidator(bool IsLegacySystem)
{
When(item => item.Selected, () =>
{
RuleFor(item => item.IsLegacySoftware)
.Equal(IsLegacySystem).WithMessage("Software is incompatible with system");
});
}
}
正如你所看到的,我通过为每个条件设置一个 When 来实现这一点。它有效,但它违反了 DRY,并且在具有两个以上条件的情况下使用是不实际的。
理想情况下,我希望有一个 RuleForEach 可以做到这一点,不需要何时,例如:
RuleForEach(order => order.SoftwareItem)
.SetValidator(new SoftwareItemValidator(order => order.IsLegacySystem));
但是我看不到任何将 IsLegacySystem 传递给该构造函数的方法。