2

我有一个超过两层深度的对象图。它表示具有子孙的实体(聚合):

A → B → C

我想在图表的所有级别上进行验证。我知道我可以在使用重载或使用规则验证B时访问A。我还没有弄清楚如何使用这两种技术从C的验证器访问A因为似乎没有上下文。Must()Custom()

我能够做我想做的唯一方法是创建一个新的对象,它是一个扁平的表示。换句话说,创建一个将AC放在同一级别的包装器,这允许我使用CMust()上的重载来到达伪父Wrapper上的A

Wrapper → A → B → C
        → C

问题是我必须创建另一个验证器(在这种情况下为Wrapper )。我更愿意将我对特定事物的所有验证逻辑放在一起。

还有其他方法吗?

4

1 回答 1

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);
        }
    }
}
于 2016-12-07T06:28:14.300 回答