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

この問題の1つは、memoize()がクロージャでのみ機能することです。クロージャはオブジェクトなので、サービスに格納すると「状態」になります。

grailsでサービスをキャッシュするより良い方法は、Spring Cache pluginです。次に、サービスメソッドの結果をキャッシュするには、メソッドに@Cacheableと注釈を付けるだけです。複数のキャッシュをサポートし、自動的にフラッシュし、コントローラー出力もキャッシュします。

+0

私はこの回答を受け入れるつもりです。明らかにするには、.memoize()は、ステートレスの原則に反しているので、通常のWebアプリケーションで意味をなさないことに同意していますか? – Mikey

+0

さて、キャッシュは定義上ステートフルです。しかしSpringキャッシュは、ある場所に状態を保持し、クラスタリングを適切に処理し、メソッドの代わりにクロージャを使う必要がないので、 'memoize()'よりGrails/Springに適しています。 – ataylor

関連する問題