2

Ce n'est pas une question très simple, mais j'espère que quelqu'un l'a rencontré.Utilisation de FluentValidation avec Castle Windsor et Entity Framework 4.0 (POCO) dans MVC2

Je suis en train de faire les choses suivantes travailler ensemble:

  1. MVC2
  2. FluentValidation
  3. Entity Framework 4.0 (POCO)
  4. Château Windsor

J'ai assez beaucoup a tout fonctionné. J'ai installé Castle Windsor et je travaille avec les Controllers desservis par WindsorControllerFactory qui fait partie de MVCContrib. J'ai également Castle desservant les validateurs FluentValidation comme décrit par cet article: http://www.jeremyskinner.co.uk/2010/02/22/using-fluentvalidation-with-an-ioc-container/

Mon problème vient quand j'essaie d'utiliser Html.EditorForModel ou EditorFor sur une vue. Lorsque je tente de faire que je reçois ce message d'erreur:

Aucun composant pour supporter le service FluentValidation.IValidator`1 [[System.Data.Entity.DynamicProxies.State_71C51A42554BA6C3CF05105DA05435AD209602C217FC4C34CA52ACEA2B06B99B, EntityFrameworkDynamicProxies-BrindleyInsurance.BusinessObjects, Version = 1.0.0.0 , Culture = neutral, PublicKeyToken = null]] a été trouvé

Ceci est dû à l'utilisation de la génération POCO sur Entity Framework 4.0. Lors de l'exécution, les classes générées sont encapsulées avec un proxy dynamique, ce qui permet le suivi et le chargement paresseux. Apparemment, lorsque vous utilisez EditorForModel ou EditorFor, il tente de demander à Windsor de créer un validateur pour le type de proxy dynamique au lieu du type réel sous-jacent.

Est-ce que quelqu'un sait ce que je peux faire pour résoudre ce problème?

+0

Y at-il un moyen de détecter les proxies dans EF4? –

+0

Comment avez-vous eu l'occasion d'avoir IValidator fermé sur un type de proxy? –

+0

Le cadre est responsable de cela. J'ai utilisé Entity Framework 4 avec les modèles POCO. EF enveloppe les types réels avec des types de proxy lors de l'exécution afin qu'il puisse faire des choses comme le chargement paresseux. Donc, sans que vous le sachiez, vous utilisez un type de proxy. Le cadre récupère cela lorsqu'il appelle la fabrique de validateurs et la transmet à l'usine. Bien sûr, l'usine ne le sait pas, alors vous obtenez l'erreur. Je vais travailler sur la création d'une nouvelle usine de validation comme l'indique l'une des réponses. Je posterai si je le fais fonctionner. –

Répondre

2

Je vous suggère d'écrire FluentValidatorFactory personnalisé qui retournera la classe de validateur correcte pour le proxy de classe.

+0

C'était la bonne réponse. Je vais donner à cette affiche un crédit pour la réponse et ajouterai une autre réponse avec le code que j'ai utilisé. –

3

Ceci est la méthode CreateInstance de ma ValidatorFactory. Si vous voyez un meilleur moyen, s'il vous plaît commenter.

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

Merci d'avoir posté la solution finale – JohnMetta

Questions connexes