Spring.Net/Caliburn v2 Ад зависимостей?

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

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

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

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

Любые идеи?


person Nick W.    schedule 10.04.2011    source источник


Ответы (2)


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

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

person Sebastian Piu    schedule 11.04.2011

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

var objectDefinitionReader = new XmlObjectDefinitionReader(applicationContext);
objectDefinitionReader.LoadObjectDefinitions(GetCaliburnDependentContextFiles());
applicationContext.Refresh();
person Nick W.    schedule 11.04.2011