1

假设我有一个客户,他有一个订单清单和一个愿望清单。在我的模型中,我有一个ClientRepoOrderRepoWishListRepo。在控制器中,我应该在哪里实例化这些存储库?让它们成为类级实例是个好主意吗?

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需要访问相同的存储库。

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

4

1 回答 1

3

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

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 快速入门,了解您可以使用它执行的其他一些操作。

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

任何声明的 bean 都由框架注入到控制器的“bean”范围内,因此它们可供任何侦听器函数使用。但是请注意,bean 注入发生初始化之后,因此您不能将它们用作 init() 函数。

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

有关 Model-Glue 中 bean 注入的更多信息,请查看Model-Glue Wiki上的Bean Injection HOWTO

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

于 2011-09-03T04:00:02.917 回答