我有两个以上深度的对象图。它代表一个有子女和孙子的实体(aggregate):
A → B → C
我想在图表的所有级别进行验证。我知道在使用Must()
重叠或使用Custom()
规则验证 B 时,我可以访问 A 。我还没有想出如何使用这两种技术从 C 的验证器访问 A ,因为似乎没有上下文。
我能够做我想做的唯一方法就是创建一个扁平表示的新对象。换句话说,创建一个将 A 和 C 放在同一级别的包装器,这允许我在 C Must()重载>在伪父 Wrapper 上获得 A 。
Wrapper → A → B → C
→ C
问题是我必须创建另一个验证器(在这种情况下为 Wrapper )。我更愿意将所有验证逻辑保留在一起。
还有其他办法吗?
答案 0 :(得分:0)
我尝试将您的案例放在代码中,因此我们可以继续处理并找到解决方案。
using FluentValidation;
namespace FluentDemo
{
class Program
{
static void Main(string[] args)
{
// TODO
}
}
class A
{
public string MyProperty { get; set; }
}
class B
{
public string OtherProperty { get; set; }
public A A { get; set; }
}
class C
{
public string DifferentProperty { get; set; }
public B B { get; set; }
}
class AValidator : AbstractValidator<A>
{
public AValidator()
{
RuleFor(a => a.MyProperty)
.NotNull();
}
}
class BValidator : AbstractValidator<B>
{
public BValidator(IValidator<A> aValidator)
{
RuleFor(b => b.OtherProperty)
.NotNull();
RuleFor(b => b.A)
.SetValidator(aValidator);
}
}
class CValidator : AbstractValidator<C>
{
public CValidator(IValidator<B> bValidator)
{
RuleFor(c => c.DifferentProperty)
.NotNull();
RuleFor(c => c.B)
.SetValidator(bValidator);
}
}
}