Spring.net将ProxyFactoryObject与使用构造函数注入的对象一起使用

时间:2010-02-10 13:12:47

标签: .net spring.net

我有一个问题,我试图通过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?谁能帮忙......

1 个答案:

答案 0 :(得分:3)

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

更长的答案:它与构建代理的方式有关,请看看Erich Eichingers关于Spring.NET如何创建代理的博客。部分123

既然您要代理一个类,请查看Spring.NET documentation,它表示非虚方法的问题。