聚合验证孙子对象的替代方法?

时间:2016-11-30 22:00:41

标签: c# validation fluentvalidation object-graph

我有两个以上深度的对象图。它代表一个有子女和孙子的实体(aggregate):

A → B → C

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

我能够做我想做的唯一方法就是创建一个扁平表示的新对象。换句话说,创建一个将 A C 放在同一级别的包装器,这允许我在 C Must()重载>在伪父 Wrapper 上获得 A

Wrapper → A → B → C
        → C

问题是我必须创建另一个验证器(在这种情况下为 Wrapper )。我更愿意将所有验证逻辑保留在一起。

还有其他办法吗?

1 个答案:

答案 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);
        }
    }
}