Spring.Net/Caliburn v2 Зависимость ада? - PullRequest
0 голосов
/ 11 апреля 2011

Я создаю проект вместе с Spring.NET и Caliburn v2. У меня есть некоторые объекты, которые я пытаюсь создать, но не знаю, как это сделать.

Я использовал аннотации аспектов Caliburn IoC (Singleton и PerRequest), чтобы получить объекты в контексте Spring. Проблема в том, что у меня есть два объекта, A и B, где Object B является подклассом Object A (то есть B также является A). Это означает, что если я зарегистрирую оба, Spring пожалуется на неоднозначность при запросе объекта типа A. Чтобы обойти это, я мог бы перестать использовать аспекты IoC Caliburn для регистрации объектов и вместо этого регистрировать их в XML-файлах контекста Spring. Таким образом, я могу указать именованный объект в файле контекста Spring для использования в конструкторе объекта C, которому нужен объект типа B.

Однако это создает новую проблему. Объект B нуждается в вводе оконного менеджера Caliburn (который недоступен контейнеру Spring в момент создания экземпляров объектов, перечисленных в XML-файлах контекста, но только позже, после загрузки Caliburn и добавления своих собственных объектов в Spring контейнер).

Я мог бы просто удалить наследование и позволить некоторому дублированию кода между объектами A и B, но тогда какой смысл заниматься ОО-программированием? В противном случае, я думаю, что я ищу способ указать объекты в XML-контексте Spring.NET, но не разрешать их до тех пор, пока Caliburn не загрузится.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

Я не знаком с Caliburn, но если вы хотите отложить создание экземпляров, вы можете пометить свои объекты в xml как lazy-init, например: <object id="foo" type="..." lazy-init="true"/>

Таким образом, они будут созданы, когда выпервый запрос их

0 голосов
/ 12 апреля 2011

Мне удалось решить эту проблему, сохранив отдельный список калибровочно-зависимых пружинных XML-файлов контекста. Я загрузил их в объект ApplicationContext, добавив следующий код в начале переопределенного метода DisplayRootView () в загрузчик моего приложения:

var objectDefinitionReader = new XmlObjectDefinitionReader(applicationContext);
objectDefinitionReader.LoadObjectDefinitions(GetCaliburnDependentContextFiles());
applicationContext.Refresh();
...