我有一段代码在运行时使用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
中的侦听器引用未解析。
非常感谢有关此问题的任何帮助。
问候,奥拉
答案 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的目的。