2010-02-10 2 views
1

나는 Spring.net에서 ProxyFactoryObject를 통해 객체를 호출하려고하는데 문제가있다. 이제 공장에서 호출하는 객체에는 생성자 주입을 통해 참조로 다른 객체를 가져 오는 하나의 생성자가 있습니다. C# 코드에서 프록시를 호출하면 올바른 대상 객체가 프록시에서 반환되지만 initital 생성자 호출을 통해 무언가로 설정해야하는 내부 항목은 비어 있습니다. 이제 왜 이런 일이 일어나고 있는지 잘 모르겠습니다.Spring.net 생성자 삽입을 사용하는 객체에서 ProxyFactoryObject 사용하기

<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# 코드는 다음과 같습니다 :

MY의 app.config 섹션은 다음과 같습니다 개체

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

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

이제 클래스의 실제 실현하는 것이 정말 아니다 중요하지만 우리가 여기에 정말로 관심있는 유일한 클래스는 다음과 같습니다.

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

이제 i '왜 내 프록시 팩토리에서 위의 클래스를 호출 할 때 null로 설정된 유일한 생성자에 의해 설정된 필드 둘 다합니까? 누구든지 도울 수 있습니다 ......

답변

3

간단한 답변 : number 및 movieFinder 속성을 속성에 추가하고 속성 대신 FindMovies 메서드를 사용하고 필드 대신 속성을 직접 사용하십시오.

길게 대답 : 프록시 생성 방법과 관련이 있습니다. Erich Eichingers의 블로그에서 Spring.NET이 프록시를 만드는 방법을 살펴보십시오. 부품 1, 23.

클래스를 프록 싱 중이므로 Spring.NET documentation을 보면 가상이 아닌 메소드의 문제점을 나타냅니다.