我有一个问题,我试图通过ProxyFactoryObject在spring.net中调用一个对象。现在,我在工厂中调用的对象有一个构造函数,它通过构造函数注入引用另一个对象。当我从c#代码调用代理时,从代理返回正确的目标对象,但其中应该通过initital构造函数调用设置为某些内容的项是空的。现在我不确定为什么会这样。
我的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();
现在课程的实际实施并不重要,但我们真正关注的唯一课程如下:
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?谁能帮忙......
答案 0 :(得分:3)
简短回答:将number和movieFinder设为属性,将virtual关键字添加到属性和FindMovies方法,并直接使用属性而不是字段。
更长的答案:它与构建代理的方式有关,请看看Erich Eichingers关于Spring.NET如何创建代理的博客。部分1,2和3。
既然您要代理一个类,请查看Spring.NET documentation,它表示非虚方法的问题。