2016-11-04 28 views
1

给定一个基类,该基类有一个通用参数,用于定义属性的类型,并且对另一个基类型有限制,当为派生类编写Fluent Validator时,该验证程序如何切换应用哪个子验证程序到通用属性?如何根据属性的运行时类型动态选择验证器?

下面是一些示例类来证明这一点的配置:

public abstract class BaseParent<TChildType> where TChildType : BaseChild 
{ 
    public TChildType Child {get; set;} 
} 

public abtract class BaseChild 
{ 
    public sting ChildPropOne {get; set;} 
} 

public class ChildA : BaseChild 
{ 
    public string ChildAPropOne {get; set;} 
} 

public class ChildB: BaseChild 
{ 
    public string ChildBPropOne {get; set;} 
} 

public class ParentA<TChildType> : BaseParent<TChildType> where TChildType : BaseChild 
{ 
    public string ParentAPropOne {get; set;} 
} 

public class ParentB<TChildType> : BaseParent<TChildType> where TChildType : BaseChild 
{ 
    public string ParentBPropOne {get; set;} 
} 

我的当前设置强制每个父类型+子类型的组合不同的验证器类。理想情况下,我可以写每个家长一个校验,每名儿童之一,并具有能够选择调用

+0

如果您使用DI容器来解析验证器 - 您可以使用注入的实例将子验证器注入父验证器和“SetValidator”。 –

+0

谢谢阿列克谢,这基本上是我最终结束了,虽然使用手动DI。如果你愿意的话,可以把它作为一个答案。 – Phaeze

回答

2

你可以注入孩子的校验器实例为母公司的验证和使用SetValidatorChild财产子验证父验证:

public class ParentAValidator<TChildType> : AbstractValidator<ParentA<TChildType>> where TChildType : BaseChild 
{ 
    public ParentAValidator(IValidator<TChildType> childValidator) 
    { 
     RuleFor(p => p.Child).SetValidator(childValidator); 
    } 
} 
相关问题