Model view controller 在ColdFusion模型粘合控制器中,我应该在哪里实例化我的模型?

Model view controller 在ColdFusion模型粘合控制器中,我应该在哪里实例化我的模型?,model-view-controller,coldfusion,coldfusion-9,model-glue,Model View Controller,Coldfusion,Coldfusion 9,Model Glue,假设我有一个客户,他有一份订单清单和一份愿望清单。在我的模型中,我有一个ClientRepo、orderepo和WishListRepo。在控制器中,我应该在哪里实例化这些存储库?让它们成为类级实例是个好主意吗 component ClientController { ClientRepo = new ClientRepo(); OrderRepo = new OrderRepo(); WishListRepo = new WishListRepo(); pub

假设我有一个客户,他有一份订单清单和一份愿望清单。在我的模型中,我有一个
ClientRepo
orderepo
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
中的其他函数需要访问相同的存储库


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

披露:我是Model Glue项目的参与者,所以我可能知道我在说什么:-)

CFML没有真正的类级实例,比如Java。如果您想要单例(一个应用程序的多个部分共享的单个实例),那么您需要将它放在一个共享范围内(yuk!),或者使用一个bean容器。幸运的是,ModelGlue与ColdSpring(CFML的一个流行bean容器)紧密集成,ModelGlue 3使在控制器中使用ColdSpring bean比以往任何时候都更容易

首先,编辑ColdSpring.xml以包含单例的定义:

<bean id="ClientRepo" class="MyApp.model.client.ClientRepo"/>
<bean id="OrderRepo" class="MyApp.model.order.OrderRepo"/>
任何声明的bean都会被框架注入控制器的“bean”范围,因此它们可以被任何侦听器函数使用。但是请注意,bean注入发生在初始化之后,因此不能将其用于init()函数

默认情况下,ColdSpringBean是单例的,因此如果将同一个ColdSpringBean注入多个控制器,那么它们最终都会得到同一个bean实例。如果将singleton=“false”添加到bean定义中,那么每个控制器都将以不同的实例结束;我想不出你为什么要这么做

有关模型胶中bean注入的更多信息,请查看上的

ModelGlue 3.1在框架初始化时将其所有控制器实例化为单例,因此每个应用程序只创建一个控制器。未来的版本可能会延迟控制器的实例化,直到第一次需要它们,所以最好不要假设它们何时初始化。如果您确实需要在应用程序初始化时在控制器中执行一些代码,我建议您向其添加一个onApplicationStart侦听器

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
    }
}