2010-02-10 93 views
1

我遇到了一个问题,我试图通过ProxyFactoryObject在spring.net中调用一个对象。现在我在工厂调用的对象有一个构造函数,它通过构造函数注入来引用另一个对象。当我从C#代码调用代理从代理返回正确的目标对象,但它应该被设置为通过初始化构造函数调用某些内容的项目是空的。现在我不确定为什么会发生这种情况。Spring.net将ProxyFactoryObject与使用构造函数注入的对象一起使用

我的app.config对象部分低于:

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

而下面是我必须把这个C#代码:

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

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

现在类的实际FPGA实现是真的不重要的,但我们真正关心的唯一的类在这里列出如下:

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

现在我'不知道为什么当我从我的代理工厂调用上面的类做两个由唯一的构造函数设置为null设置的字段?任何人都可以帮忙......

回答

3

简答题:将number和movieFinder设为属性,将virtual关键字添加到属性和FindMovies方法中,并直接使用属性而不是字段。

更长的答案:它与代理的构建方式有关,请参阅Erich Eichingers的博客,了解Spring.NET如何创建代理。部分1,23

而且由于您正在代理某个班级,请查看Spring.NET documentation,这表明非虚拟方法存在问题。

相关问题