以下哪种方法被认为是在用户会话期间将数据存储在 grails 中的推荐方法?
- 在实际会话中存储一堆单独的变量。
- 在会话中存储域模型类对象。
- 使用会话范围的控制器并将变量存储为控制器字段或属性。
- 使用会话范围的控制器并将数据存储为存储在控制器中的域模型类对象。
- 其他一些我还没有想到的方法。
以下哪种方法被认为是在用户会话期间将数据存储在 grails 中的推荐方法?
我喜欢为这类事情使用会话范围的服务。使用这种方法,您可以将会话范围服务的代理注入到全局范围服务(或控制器)中,这意味着您无需担心跟踪您放入会话中的内容。
这里有一个不错的小教程,向您展示如何混合不同范围的服务。看起来该教程的作者还编写了一个插件来简化该过程(尽管我实际上并没有尝试过该插件)。
编辑:
这是一个示例,展示了您如何设置它并实际使用服务代理将内容传递给您的视图:
创建一个服务来保存你的会话范围的东西,比如用户购物车或其他东西。它只是一个常规服务(引用其他服务等),但您可以将特定于会话的内容存储为成员变量 -
class MySessionScopedService {
def currentUser
def shoppingCart
...
}
在resources.groovy
中,为您的服务设置会话范围的代理。MySessionScopedService
您将为其注入代理,而不是直接注入其他服务。
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]
}
}
正如 sudhir 已经指出的那样,直接存储在会话中的地图对我来说是最简单和最值得期待的方式。