2016-11-04 3 views
1

Étant donné une classe de base dotée d'un paramètre générique utilisé pour définir le type d'une propriété et ayant une restriction sur un autre type de base, comment écrire un validateur Fluent pour une classe dérivée à la propriété générique?Comment sélectionner dynamiquement un validateur en fonction du type d'exécution de la propriété?

Voici quelques exemples de cours pour démontrer cette configuration:

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

Ma configuration actuelle oblige une classe validateur différente pour chaque type de parent + combinaison de type enfant. Idéalement, je peux écrire un validateur par parent et un par enfant et ont le validateur parent en mesure de choisir quel enfant validateur appeler

+0

Si vous utilisez un conteneur DI pour résoudre les validateurs - vous pouvez injecter un validateur enfant dans le validateur parent et 'SetValidator' avec une instance injectée. –

+0

Merci Aleksey, c'est essentiellement ce que j'ai fini par aller pour l'instant, bien que l'utilisation manuelle DI. Allez-y en chair et en os comme réponse si vous voulez. – Phaeze

Répondre

2

Vous pouvez injecter l'instance de validateur de l'enfant dans le validateur parent et utiliser SetValidator pour Child propriété:

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