2010-08-06 3 views
2

J'ai configuré mon projet MVC pour utiliser Fluent Validation et Castle Windsor et tout fonctionne à merveille. J'utilise une fabrique de validateurs personnalisée pour prendre en compte le fait que j'utilise également Entity Framework et que je dois prendre en compte les proxys dynamiques qui sont enroulés autour de mes classes POCO. Voici mon CastleWindsorValidatorFactory:Castle Windsor et la validation courante comme validateur MVC

public override IValidator CreateInstance(Type validatorType) 
{ 
    if(validatorType.GetGenericArguments()[0].Namespace.Contains("DynamicProxies")) 
    { 
     validatorType = Type.GetType(String.Format("{0}.{1}[[{2}]], {3}", validatorType.Namespace, validatorType.Name, validatorType.GetGenericArguments()[0].BaseType.AssemblyQualifiedName, validatorType.Assembly.FullName)); 

    } 

    return ResolveType.Of(validatorType) as IValidator; 
} 

Tout fonctionne bien quand un validateur existe pour le modèle que l'action du contrôleur est modèle de liaison. Si aucun validateur n'existe pour ce modèle particulier, j'obtiens une erreur indiquant que Windsor ne peut pas résoudre ce type.

Mais, tous les modèles n'ont pas besoin d'un validateur. Je peux en écrire un vide, mais c'est juste un code inutile. Est-ce que je devrais juste attraper l'erreur et l'ignorer quand j'essaye de résoudre un validateur? Y at-il quelque chose de construit dans Castle qui va m'aider avec ça? Que devrais-je faire?

Répondre

0

Ce que je fini par faire c'était pour attraper le ComponentNotFoundException dans mon ValidatorFactory et retourner null comme ceci:

public class CastleWindsorValidatorFactory : ValidatorFactoryBase 
{ 
    public override IValidator CreateInstance(Type validatorType) 
    { 
     if(validatorType.GetGenericArguments()[0].Namespace.Contains("DynamicProxies")) 
     { 
      validatorType = Type.GetType(String.Format("{0}.{1}[[{2}]], {3}", validatorType.Namespace, validatorType.Name, validatorType.GetGenericArguments()[0].BaseType.AssemblyQualifiedName, validatorType.Assembly.FullName)); 

     } 

     try 
     { 
      return ResolveType.Of(validatorType) as IValidator; 
     } 
     catch(ComponentNotFoundException) 
     { 
      return null; 
     } 
    } 
} 

Pas tout à fait sûr que c'est la meilleure chose à faire, mais il semble fonctionner.

Questions connexes