1

比方说,我有一个客户谁拥有订单和愿望清单。在我的模型中,我有一个ClientRepo,OrderRepoWishListRepo。在控制器中,我应该在哪里实例化这些存储库?让他们成为课堂级别的实例是个好主意吗?我应该在ColdFusion Model Glue控制器中实例化我的模型?

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等功能需要访问同一个存储库。

另外,控制器的寿命是多少?它是每次请求一次,每次会话一次还是每次应用一次?

回答

3

披露:我是一个贡献者模型胶项目,所以我大概知道我在说什么:-)

CFML没有真正的类级的情况下,像Java。如果你想要单身人士(一个应用程序的许多部分共享一个实例),你需要把它放在一个共享的范围(yuk!)中,或者使用一个bean容器。幸运的是,Model-Glue与ColdSpring(用于CFML的流行bean容器)紧密集成,Model-Glue 3使您在控制器中使用ColdSpring bean变得比以往更容易。

首先,编辑您ColdSpring.xml包括定义为单例:

<bean id="ClientRepo" class="MyApp.model.client.ClientRepo"/> 
<bean id="OrderRepo" class="MyApp.model.order.OrderRepo"/> 

当然这只是一个简单的例子。 ColdSpring是一个基于Java的Spring的强大的依赖注入框架。查看ColdSpring Quickstart以了解您可以使用的其他一些功能。

一旦在ColdSpring中定义了bean,就可以让你的控制器通过getModelGlue()。getBean()调用显式地请求它们。然而更好的方法是声明你的控制器对这些bean的依赖,并让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 
    } 
} 

任何声明豆注入到你的控制器通过框架的“豆”范围,使他们准备任何监听功能使用。但是请注意,注入初始化,所以你不能使用它们的init()函数。

默认情况下,ColdSpring bean是单例,所以如果同一个ColdSpring bean被注入到多个控制器中,它们都将以bean的相同实例结束。如果将singleton =“false”添加到bean定义中,则每个控制器都将以不同的实例结束;我想不出为什么你想这样做。

欲了解更多关于Model-Glue喷射豆浆的信息,请查看Model-Glue Wiki上的Bean Injection HOWTO

Model-Glue 3.1在框架初始化时将其所有控制器实例化为单例,因此每个控制器都是每个应用程序创建一次。未来的版本可能会延迟控制器的实例化,直到它们首次被需要时为止,所以最好不要在初始化时作出假设。如果您真的需要在应用程序初始化时执行一个控制器中的某些代码,我建议您为它添加一个onApplicationStart侦听器。

+0

谢谢!很有帮助! –

相关问题