2016-04-07 10 views
1

は、以下のスコープについて書かれている:Grailsの3コントローラスコープ

プロトタイプ(デフォルト) - 新しいコントローラは、リクエストごとに作成されます(閉鎖性などのアクションを推奨)

static scope = "prototype" 

徳:ここ

奇妙な部分があれば、私は明示的に状態私はGrailsの3.1.4で大幅に異なる結果を得ることです例えばe。次UserControllerで

class UserController { 
    def userService 
    List<String> users 

    def loadUsers() { 
     if (!users) { 
      println("########## have to load users"); 
      try { 
       user = userService.getAllUsersInAd() 
      } catch (Exception e) { 
       // do something 
      } 
     } else { 
      println("########## dont have to do it " + users.size()); 
     } 
    } 
} 

と静的スコープが省略されている

class UserService { 
    def getAllUsersInAd() { 
     println("######### querying") 
     return new ArrayList<String>(); 
    } 
} 

場合は、次のUserServiceの:私はFirefoxブラウザを閉じて再度開いたときに、「に持っていけない

それは何回何回クローズ/再オープンしても関係なく実行されます。これについてもっと奇妙なのは、私がFirefoxを閉じたときに全く別のブラウザ(chromeなど)を開くことができ、同じメッセージが実行されるということです。このコントローラーの範囲がJSFの@ApplicationScopeと似ています。 5〜10分のアイドル時間が経過すると、クエリは再度実行されますが、シナリオは残ります。静的スコープが記載されている場合は

:予想通り、各ブラウザ閉じた後

が実行され、「ユーザーをロードするようにしています」。

私の質問は、デフォルトのスコープについてのドキュメントが間違っていますか?そうでない場合は、明示的にscope = "prototype"を記述し、それを省略すること(上記の明白さを除いて)との違いは何ですか?

答えて

3

は、あなたがこのような設定が表示されるはずのGrails 3.1.4アプリのためのapplication.ymlファイルを生成しました。デフォルトのスコープはprototypeです(この設定が設定されていない場合)。

+0

あなたの設定が上記の通りであれば、コントローラーに 'static scope = ...'がなければ、コントローラーは 'singleton'スコープになります。これは、あなたのコントローラに 'static scope = 'prototype''があるときに違った振る舞いをする理由を説明します。 –

1

はい、コントローラはシングルトン(アプリケーション)のスコープに変更されました(以前のバージョン1.4.x)。私はその文書を見つけることを試みている。もともとhereというJIRAの問題修正のようですが、GrailsはJIRAから離れ、すべてのバグをGitHubに移行しませんでした。 Why does Grails recommend singleton scope for controllers with actions as methods? 参照バートの答えを、そしてジェフでもコメントでアップ話す:

あなたはとにかくGrailsのチームによると、コントローラに状態を持つべきではありません。

編集:Jeff氏によると、デフォルトはまだプロトタイプですが、デフォルトの生成された設定ではすべてシングルトンに変更されるため、これが推奨されます。コントローラのシングルトンを作成するためのフレームワークに指示します

grails: 
    controllers: 
     defaultScope: singleton 

:デフォルトで

+1

"私はコントローラがシングルトン(アプリケーション)のスコープに変更されたと思っています。デフォルトの生成された設定がスコープをシングルトンに設定するように変更しましたが、実際のデフォルトはプロトタイプです。 3.1.4では、https://github.com/grails/grails-core/blob/e402f3fa32f84c1b816e97db893158606517f89e/grails-core/src/main/groovy/org/grails/core/DefaultGrailsControllerClass.java#L80で課されています。 –

+0

ありがとうございました。私は2.xがシングルトンに設定された別の設定を持っていたと仮定します。 – billjamesdev

+0

"2.xはシングルトンに設定された別の設定を持っていたと仮定します。" - します。どちらの場合もデフォルトは 'prototype'であり、設定が優先されます。 –