Где я должен создавать экземпляры своих моделей в контроллере ColdFusion Model Glue? - PullRequest
1 голос
/ 03 сентября 2011

Допустим, у меня есть клиент, у которого есть список заказов и список пожеланий. В моей модели у меня есть 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 Ответ

3 голосов
/ 03 сентября 2011

Раскрытие информации: я участвую в проекте 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.Проверьте ColdSpring 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-компонентов контроллера, поэтому они готовы к использованию любыми функциями слушателя.Однако обратите внимание, что внедрение bean-компонента происходит после инициализации , поэтому вы не можете использовать их как функцию init ().

Bean-компоненты ColdSpring по умолчанию являются синглетонами, поэтому, если один и тот же компонент ColdSpring внедряется в несколько контроллероввсе они получат один и тот же экземпляр компонента.Если вы добавите singleton = "false" в определение bean-компонента, то каждый контроллер получит свой экземпляр;Хотя я не могу понять, почему вы захотите сделать это.

Для получения дополнительной информации о введении бобов в Model-Glue, посмотрите Bean Injection HOWTO на Model-Glue Wiki .

Model-Glue 3.1 создает все свои контроллеры во время инициализации фреймворка как одиночные, поэтому каждый контроллер создается один раз для каждого приложения.Будущие версии могут отложить создание экземпляров контроллеров до тех пор, пока они не потребуются, поэтому лучше не делать предположений относительно того, когда они инициализируются.Если вам действительно нужно, чтобы какой-то код в контроллере выполнялся во время инициализации приложения, я предлагаю вам добавить к нему прослушиватель onApplicationStart.

...