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

謝謝!很有幫助! –

相關問題