2012-03-16 61 views
1

用于记忆无副作用且仅查找的服务方法的语法是什么?这个备忘录会不会在会话中持续存在,还是会在网络世界中毫无用处?有没有在grails应用程序中使用.memoize()的好地方的例子?Grails:使用.memoize()的例子?

class DetermineStuffService{ 
    def figureThisOut(def whatever){ 
    //look up all sorts of stuff and do some heavy side-effect free processing 
    return nastyHashmap 
    } 
} 

因此,在一个控制器可不知何故,我打电话DetermineStuffService.figureThisOut(someRandomObject)和采取的.memoize()优势?

回答

1

与此有关的一个问题是,memoize()只适用于关闭。闭包是对象,所以如果你在服务中存储一个,它就是“状态”。

在grails中缓存服务的更好方法是使用Spring Cache plugin。然后缓存服务方法的结果,只需用@Cacheable注释方法即可。它支持多个缓存,自动刷新以及缓存控制器输出。

+0

我打算接受这个答案。要清楚:我们同意.memoize()在正常的web应用程序中没有意义,因为它违背了无状态的原则,是正确的? – Mikey 2012-03-16 21:55:11

+0

那么,缓存是有状态的定义。然而,Spring缓存的方式比'memoize()'更适合grails/spring,因为它将状态保存在一个地方,正确处理集群,并且不需要使用闭包而不是方法。 – ataylor 2012-03-16 22:01:05