2012-03-16 63 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