Где я должен создавать экземпляры своих моделей в контроллере ColdFusion Model Glue?
Допустим, у меня есть клиент, у которого есть список заказов и список пожеланий. В моей модели у меня есть ClientRepo
, OrderRepo
, а также WishListRepo
, В контроллере, где я должен создавать экземпляры этих репозиториев? Это хорошая идея, чтобы сделать их экземплярами уровня класса?
component ClientController
{
ClientRepo = new ClientRepo();
OrderRepo = new OrderRepo();
WishListRepo = new WishListRepo();
public void function HomePage(any event)
{
var clientId = event.getValue("id");
var client = ClientRepo.getClientById(clientId);
var orders = OrderRepo.getOrdersForClientId(clientId);
// put the variables into the event object for the view to access
}
}
Или лучше было бы создать их экземпляр в функции?
public void function HomePage(any event)
{
var ClientRepo = new ClientRepo();
var orderRepo = new OrderRepo();
var wishListRepo = new WishListRepo();
// rest of the code is the same
}
Здесь предполагается, что другие функции в ClientController
нужен доступ к тем же репозиториям.
Кроме того, каков срок службы контроллера? Это один раз на запрос, один раз на сеанс или один раз на приложение?
1 ответ
Раскрытие информации: я участвую в проекте Model-Glue, поэтому я, наверное, знаю, о чем говорю:-)
CFML не имеет настоящих экземпляров уровня класса, таких как Java. Если вы хотите синглтоны (один экземпляр, совместно используемый многими частями приложения), вам нужно либо поместить его в общую область (yuk!), Либо использовать бобовый контейнер. К счастью, Model-Glue тесно интегрирован с ColdSpring (популярным контейнером компонентов для CFML), а Model-Glue 3 упрощает использование компонентов ColdSpring в ваших контроллерах.
Сначала отредактируйте файл ColdSpring.xml, чтобы включить определения для ваших синглетонов:
<bean id="ClientRepo" class="MyApp.model.client.ClientRepo"/>
<bean id="OrderRepo" class="MyApp.model.order.OrderRepo"/>
Это всего лишь простой пример, конечно. ColdSpring - это мощная среда внедрения зависимостей, основанная на Java Spring. Проверьте QuickSpring Quickstart для некоторых других вещей, которые вы можете сделать с ним.
Как только бины определены в ColdSpring, ваш контроллер может явно запрашивать их через вызовы getModelGlue(). GetBean(). Однако лучший способ - объявить зависимость вашего контроллера от этих компонентов и позволить Model-Glue внедрить их в ваш контроллер для вас. Зависимость может быть объявлена либо в ModelGlue.xml, либо в CFC вашего контроллера. Вот как объявить зависимости bean-компонентов в вашем контроллере:
component ClientController beans="ClientRepo,OrderRepo"
{
public void function HomePage(any event)
{
var clientId = event.getValue("id");
var client = beans.ClientRepo.getClientById(clientId);
var orders = beans.OrderRepo.getOrdersForClientId(clientId);
// put the variables into the event object for the view to access
}
}
Любые объявленные bean-компоненты внедряются в область действия bean-компонентов вашего контроллера средой, поэтому они готовы к использованию любыми функциями прослушивателя. Однако обратите внимание, что внедрение бина происходит после инициализации, поэтому вы не можете использовать их как функцию init().
Бины ColdSpring по умолчанию являются синглетонами, поэтому, если один и тот же компонент ColdSpring внедряется в несколько контроллеров, все они получат один и тот же экземпляр компонента. Если вы добавите singleton="false" в определение bean-компонента, то каждый контроллер получит свой экземпляр; Я не могу думать, почему ты хотел бы сделать это все же.
Для получения дополнительной информации о внедрении бобов в Model-Glue, ознакомьтесь с HOWTO по Bean Injection на Model-Glue Wiki.
Model-Glue 3.1 создает все свои контроллеры во время инициализации фреймворка как синглтоны, поэтому каждый контроллер создается один раз для каждого приложения. В будущих версиях может быть отложено создание экземпляров контроллеров до тех пор, пока они не потребуются, поэтому лучше не делать предположений относительно того, когда они инициализируются. Если вам действительно нужно иметь некоторый код в контроллере, выполняемый во время инициализации приложения, я предлагаю вам добавить к нему прослушиватель onApplicationStart.