2014-01-25 32 views
7

在用戶會話期間,以下哪種方法被認爲是將數據存儲在grails中的推薦方式?Grails:在用戶會話期間存儲數據的最佳方法

  1. 在實際會話中存儲一堆個體變量。
  2. 在會話中存儲域模型類對象。
  3. 使用會話作用域控制器並將變量存儲爲控制器字段或屬性。
  4. 使用會話作用域控制器並將數據存儲爲存儲在控制器中的域模型類對象。
  5. 還有一些我還沒有想到的方法。
+1

我不會存儲單個變量或整個域對象。而是有地圖存儲在會話中!或者是一個自定義對象,它具有要存儲在會話中的事物的屬性。您也可以使用會話範圍的服務 –

回答

3

我喜歡爲這類事情使用會話範圍的服務。通過這種方法,您可以將會話範圍服務的代理注入到全局範圍的服務(或控制器)中,這意味着您無需擔心跟蹤放入會話中的內容。

有一個很好的小教程here,向您展示如何混合不同範圍的服務。它看起來像該教程的作者也寫了一個插件,使過程更容易(雖然我沒有實際嘗試插件)。

編輯:

這裏是展示你如何設置此&實際使用服務代理傳遞的東西給你看一個例子:

創建回事握住你的會話範圍內的東西服務,就像用戶購物車或任何其他。這只是一個普通的服務(即引用其他服務等),但你可以將特定會話的東西存儲爲成員變量 -

class MySessionScopedService { 

    def currentUser 
    def shoppingCart 

    ... 

} 

resources.groovy,設立爲您服務會話範圍代理。而不是直接將​​注入到其他服務中,您將爲其注入代理。

beans = { 
    mySessionScopedServiceProxy(org.springframework.aop.scope.ScopedProxyFactoryBean) { 
     targetBeanName = 'mySessionScopedService' 
     proxyTargetClass = true 
    } 
} 

最後,當你想引用您服務,您引用的代理(請注意,我引用mySessionScopedServiceProxy,而不是mySessionScopedService)。您可以在任何全局範圍的組件中引用代理,並且在運行時,Spring將爲當前會話注入正確的代理。

class MyController { 
    def mySessionScopedServiceProxy 
    def someOtherService 

    def index() { 
     [shoppingCart: mySessionScopedServiceProxy.shoppingCart, currentUser: mySessionScopedServiceProxy.currentUser] 
    } 
} 
+0

您會如何建議將存儲在服務中的數據傳遞給視圖? –

+1

我編輯了我的答案以提供示例 – rcgeorge23

+0

感謝您的詳細解釋。 –

0

正如蘇德赫已經指出的那樣,直接存儲在會話中的地圖對我來說是最簡單,最期望的方式。