2010-02-10 2 views
1

J'ai un problème lorsque j'essaie d'appeler un objet dans spring.net via un objet ProxyFactoryObject. Maintenant, l'objet que j'appelle dans l'usine a un constructeur qui prend un autre objet par référence via l'injection du constructeur. Lorsque j'appelle le proxy à partir du code C#, l'objet cible correct est renvoyé par le proxy mais les éléments à l'intérieur de celui-ci qui doivent être définis sur quelque chose via l'appel du constructeur initital sont vides. Maintenant, je ne sais pas pourquoi cela se passe.Spring.net Utilisation de ProxyFactoryObject avec des objets qui utilisent l'injection constructeur

MON App.Config Objets section ci-dessous:

<objects xmlns="http://www.springframework.net"> 

     <object name="MyMovieLister" id="MyMovieLister" type="SpringTestProgram.Classes.MovieLister, SpringTestProgram" singleton="false"> 
      <!-- using cstor injection... --> 
      <constructor-arg index="0" ref="MyMovieFinder"/> 
      <constructor-arg index="1" value="2"/> 
     </object> 

     <object name="MyMovieFinder" id="MyMovieFinder" type="SpringTestProgram.Classes.MovieFinder, SpringTestProgram" singleton="false"/> 

     <object id="MyBeforeAdvisor" 
       type="Spring.Aop.Support.NameMatchMethodPointcutAdvisor, Spring.Aop"> 

      <property name="Advice"> 
       <object id="myBeforeAdvice" 
       type="SpringTestProgram.Classes.LoggingAdvice, SpringTestProgram"/> 
      </property> 

      <property name="MappedNames"> 
       <list> 
        <value>FindAll</value> 
       </list> 
      </property> 
     </object> 


     <object name="MovieWorkerProxy" type="Spring.Aop.Framework.ProxyFactoryObject, Spring.Aop"> 

      <property name="Target" ref="MyMovieLister" /> 

      <!--<property name="TargetSource"> 
       <object type="Spring.Aop.Target.PrototypeTargetSource, Spring.Aop"> 
        <property name="TargetObjectName" value="MyMovieLister" /> 
       </object> 
      </property>--> 

      <!--<property name="ObjectNames"> 
       <list> 
        <value>MyMovieLister</value> 
       </list> 
      </property>--> 

      <property name="interceptorNames"> 
       <list> 
        <value>MyBeforeAdvisor</value> 
       </list> 
      </property> 
     </object>  

    </objects> 

Et ci-dessous est le code C# que je dois appeler ceci:

 IApplicationContext ctx = ContextRegistry.GetContext(); 
     MovieLister myMovieLister = ctx.GetObject("MovieWorkerProxy") as MovieLister; 

     IList<string> myList = myMovieLister.FindMovies(); 

Maintenant, la implemention réelle de la classe est vraiment pas important mais la seule classe que nous sommes vraiment concernés ici est énumérée ci-dessous:

public class MovieLister 
{ 
    public MovieLister(IMovieFinder myMovieFinder, int i) 
    { 
     number = i; 
     movieFinder = myMovieFinder; 
    } 

    public IList<string> FindMovies() 
    { 
     return movieFinder.FindAll(); 
    } 

    private int number; 
    private IMovieFinder movieFinder;   
} 

Maintenant je Je ne sais pas pourquoi quand j'appelle la classe ci-dessus de ma fabrique proxy, les deux champs définis par le seul constructeur sont-ils sur null? Est-ce que n'importe qui peut aider ......

Répondre

3

Réponse courte: Rendre une propriété et une propriété movieFinder, ajouter le mot-clé virtuel aux propriétés et la méthode FindMovies et utiliser directement les propriétés au lieu des champs. Réponse plus longue: Cela a à voir avec la façon dont le proxy est construit, jetez un oeil sur le blog d'Erich Eichinger sur la façon dont Spring.NET crée des proxies. Partie 1, 2 et 3.

Et puisque vous êtes un mandataire d'une classe, jetez un oeil à la Spring.NET documentation, il indique le problème avec des méthodes non virtuelles.

Questions connexes