Как: Подключить динамически созданные представления (не одноэлементные формы) к одноэлементному контроллеру с файлом конфигурации Spring.NET? - PullRequest
1 голос
/ 29 августа 2011

У меня есть фрагмент кода, который динамически создает Windows Forms во время выполнения с использованием подхода тега lookup-method в Spring.NET. По сути, у меня есть фабричный класс для создания любого количества форм, см. Фрагмент файла конфигурации ниже.

<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 -tag не привязывается, то есть поисковое событие не будет привязано ни к одному прослушивателю событий. Очевидно, что я могу решить эту проблему, выполнив привязку в коде, но я хотел бы знать, есть ли способ сделать это в файле контекста?

Я нахожу это немного странным, поскольку вся идея фабрики lookup-method состоит в том, чтобы создать созданный экземпляр frmListView с поддержкой Spring, и это в некоторой степени, то есть свойство MdiParent установлено, как и ожидалось, но, по-видимому, ссылка на слушателя в синглтоне frmListViewController не разрешена.

Любая помощь по этому вопросу будет принята с благодарностью.

С уважением, Ола

1 Ответ

1 голос
/ 29 августа 2011

Я не знаю, как это сделать в конфигурации 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 метода *1025*.

Кстати, целью внедрения метода поиска является , а не , чтобы frmListView и frmListViewFactory знали об их контейнере .

...