【问题标题】:Alternate way to validate grandchild object in aggregate?汇总验证孙对象的替代方法?
【发布时间】:2016-11-30 22:00:41
【问题描述】:

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

A → B → C

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

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

Wrapper → A → B → C
        → C

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

还有其他方法吗?

【问题讨论】:

  • 我创建了代码示例,这样讨论会更容易一些,看看它只是基本的构建块。

标签: c# validation fluentvalidation object-graph


【解决方案1】:

我尝试将您的案例整合到代码中,以便我们着手处理并找到解决方案。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多