У меня возникли проблемы с созданием подприложения с использованием ColdSpring для создания экземпляров моих объектов.
В моем родительском приложении у меня есть конфигурационный файл ColdSpring, который без проблем создает набор компонентов. Одним из них является компонент «Категории» (CategoryGateway), в который внедрен другой компонент для таблицы (NestedSetTreeTable). Внедренный компонент содержит метод пакета «GetDatasource», который вызывается компонентом CategoryGateway.
Это работает без проблем в моем родительском приложении, однако, когда я пытаюсь создать экземпляр компонента в своем подприложении, кажется, что метод пакета недоступен для компонента CategoryGateway.
Теперь я очень новичок в ColdSpring, а также в концепции создания подприложения из родительского приложения, поэтому я не уверен, что делаю все правильно.
Вот моя установка:
Родительское приложение содержит сопоставленную версию ColdSpring и собственный файл coldspring.xml. В файле coldspring.xml содержится следующее для создания экземпляра компонента категорий:
<!-- Categories CFC -->
<bean id="categories" parent="config" class="com.categories.categoryGateway">
<constructor-arg name="sCategoriesTable">
<value>${sCategoriesTable}</value>
</constructor-arg>
<constructor-arg name="sNSTTable">
<value>${sNSTTable}</value>
</constructor-arg>
<constructor-arg name="NST">
<ref bean="categoriesNST" />
</constructor-arg>
</bean>
<!-- Categories NST Table CFC -->
<bean id="categoriesNST" parent="config" class="com.categories.NestedSetTreeTable">
<constructor-arg name="datasourceName">
<value>${sDSN}</value>
</constructor-arg>
<constructor-arg name="table">
<value>${sNSTTable}</value>
</constructor-arg>
</bean>
В Application.cfc моего родителя я создаю экземпляр компонента следующим образом:
Application.com.categories = beanFactory.getBean('categories');
Все работает корректно. Теперь в моем вспомогательном приложении у меня есть другая сопоставленная версия ColdSpring и отдельный файл coldspring.xml, чтобы я мог использовать его для создания экземпляров компонентов, специфичных для вспомогательного приложения. Я проверил, что запускается правильный файл coldspring.xml.
Я не создаю экземпляры базовых компонентов в Application.cfc моего подприложения, а вызываю Super.onApplicationStart, чтобы запустить родительский метод. Родитель содержит код создания экземпляра, однако он использует дочерний файл Coldspring.xml для поиска компонентов, поэтому я создал сопоставление с родительским приложением и соответствующим образом скорректировал дочерний файл Coldspring.xml, так что это выглядит так:
<!-- Categories CFC -->
<bean id="categories" parent="config" class="core.com.categories.categoryGateway">
<constructor-arg name="sCategoriesTable">
<value>${sCategoriesTable}</value>
</constructor-arg>
<constructor-arg name="sNSTTable">
<value>${sNSTTable}</value>
</constructor-arg>
<constructor-arg name="NST">
<ref bean="categoriesNST" />
</constructor-arg>
</bean>
<!-- Categories NST Table CFC -->
<bean id="categoriesNST" parent="config" class="core.com.categories.NestedSetTreeTable">
<constructor-arg name="datasourceName">
<value>${sDSN}</value>
</constructor-arg>
<constructor-arg name="table">
<value>${sNSTTable}</value>
</constructor-arg>
</bean>
Есть несколько других основных компонентов, которые загружаются таким образом до того, как категории выдают ошибку, поэтому метод работает, и у меня есть доступ к моим основным компонентам без явного создания их экземпляров в дочернем Application.cfc. Однако, когда он попадает в компонент категорий, я получаю следующую ошибку:
Исключение создания компонента во время init() для core.com.categories.categoryGateway
компонент [core.com.categories.NestedSetTreeTable] не имеет функции с именем [getDatasource]:
Если я сделаю метод getDatasource общедоступным, он, кажется, сработает, однако это не кажется правильным, поскольку он работает так же, как и в родительском приложении.
Добавьте к списку вещей, в которых я новичок, ООП и наследование... так что, если я делаю это совершенно неправильно, пожалуйста, дайте мне знать. Я пытаюсь отделить основные функции (управление пользователями, обработка ошибок, проверка и множество других вещей, которые я склонен повторно использовать в каждом приложении) от конкретных функций приложения (сайт электронной коммерции может иметь компонент корзины, не требуемый CMS, например) таким образом, что при разработке новой функции я могу решить поместить ее в ядро и сделать ее доступной для всех моих приложений или для конкретного приложения. Итак, в этом примере я пытаюсь загрузить основные функции в Application.cfc родителя, чтобы потомок мог их использовать автоматически. В идеале дочерний элемент не должен указывать основные функции в файле Coldspring.xml, но я не нашел способа запуска родительского и дочернего компонентов.
Любая помощь, очень ценится!
getDatasource()
; 2) как настроить родительское/дочернее приложение с помощью Coldspring. И, возможно, третий вопрос — хотя он и не подходит для S/O — об архитектуре вашего приложения. Все это в основном несвязанные вопросы, и они слишком усложняют то, что вы здесь задаете. - person Adam Cameron   schedule 08.04.2013