Howto:使用Spring.NET配置文件将动态创建的视图(非单例形式)连接到单例控制器?

时间:2011-08-29 09:33:29

标签: model-view-controller event-handling spring.net

我有一段代码在运行时使用Spring.NET中的lookup-method标记方法动态创建Windows窗体。基本上我所拥有的是一个工厂类来创建任意数量的表单,请参阅下面的配置文件片段。

<object id="frmListView" type="GUI.View.ListView, MMM" singleton="false">
    <property name="MdiParent" ref="frmMainForm" />
</object>

<object id="frmListViewController" type="Controller.View.ListView, MMM">
    <listener event="Search" method="frmListView_Search">
        <ref object="frmListView"/>
    </listener>
</object>

<object id="frmListViewFactory" type="GUI.ListViewFactory, MMM">
    <lookup-method name="createView" object="frmListView" />
</object>

问题在于,由于frmListView是动态创建的,因此似乎listener - 标记不绑定,即搜索事件不会绑定到任何事件侦听器。显然我可以通过在代码中进行绑定来解决这个问题,但我想知道在上下文文件中是否有任何方法可以做到这一点?

我发现它有点奇怪,因为lookup-method工厂的整个想法是让创建的frmListView实例具有Spring感知能力,它在某种程度上,即MdiParent属性按预期设置,但显然单例frmListViewController中的侦听器引用未解析。

非常感谢有关此问题的任何帮助。

问候,奥拉

1 个答案:

答案 0 :(得分:1)

我不知道如何在xml配置中执行此操作,实际上我甚至不确定它是否可以在xml中完成。但我可以解释为什么你的方法不起作用:

使用此配置,您可以创建一个单frmListViewController,从Search订阅frmListView事件。从容器请求此frmListView,因为它是原型(非单例),所以创建了一个新的ListView实例。

您的frmListViewController 从此Search实例收听ListView个事件,因为这就是它的配置方式。侦听器引用已解析,但它解析为您不期望的ListView实例。

在初始化容器后,您将看到创建单个ListView实例,作为frmListViewFactory创建的一部分。您可以通过在ListView构造函数中设置断点并运行与此类似的程序来测试此(例如):

internal class Program
{
    private static void Main(string[] args)
    {
        IApplicationContext ctx = new XmlApplicationContext("objects.xml");

        Console.WriteLine("Container initialized ... ");
        Console.WriteLine("Enter to exit");
        Console.ReadLine();
    }
}

您会发现创建了一个新的ListView,但没有调用frmListViewFactory的{​​{1}}方法。

BTW,查找方法注入is not to make frmListView and frmListViewFactory aware of their container的目的。