7

次の方法のうち、ユーザー セッション中に Grails にデータを保存するための推奨される方法はどれですか?

  1. 個々の変数の束を実際のセッションに保存します。
  2. ドメイン モデル クラス オブジェクトをセッションに格納します。
  3. セッション スコープのコントローラーを使用し、変数をコントローラーのフィールドまたはプロパティとして保存します。
  4. セッション スコープのコントローラーを使用し、コントローラーに格納されているドメイン モデル クラス オブジェクトとしてデータを格納します。
  5. 私がまだ考えていない他の方法。
4

2 に答える 2

3

私は、この種の目的でセッション スコープのサービスを使用するのが好きです。このアプローチでは、セッション スコープのサービスのプロキシをグローバル スコープのサービス (ま​​たはコントローラー) に挿入します。つまり、セッションに入れたものを追跡することを心配する必要はありません。

ここには、スコープの異なるサービスを混在させる方法を示す素敵な小さなチュートリアルがあります。また、そのチュートリアルの作成者は、プロセスを簡単にするプラグインも作成しているようです (ただし、実際にプラグインを試したことはありません)。

編集:

これを設定し、実際にサービス プロキシを使用してビューにデータを渡す方法を示す例を次に示します。

ユーザーのショッピング カートなど、セッション スコープのものを保持するサービスを作成します。これは単なる通常のサービス (他のサービスなどを参照する) ですが、セッション固有のものをメンバー変数として保存できます -

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]
    }
}
于 2014-01-25T10:02:17.120 に答える