2016-10-01 31 views
2

私はキャッシュを挿入するコンストラクタを持つコントローラを持っていますが、インスタンスの作成時にコンストラクタ内のメソッドを呼び出すこともしたいと思います。コンストラクタの呼び出しメソッド

def this(foo:Foo){} 

私の場合は、私のブートストラップのインスタンスが少し複雑であるため、私の場合は補助フレームワークを作成することができます。

ここで私が望む何を私のコード

class SteamController @Inject()(cache: CacheApi) extends BaseController { 

    private val GAME_IDS_LIST_API: String = "api.steampowered.com/ISteamApps/GetAppList/v2" 

    private val GAME_API: String = "store.steampowered.com/api/appdetails?appids=" 

    private val GAME_KEY: String = "games" 

    def games = Action { implicit request => 
    var fromRequest = request.getQueryString("from") 
    if (fromRequest.isEmpty) { 
     fromRequest = Option("0") 
    } 
    val from = Integer.parseInt(fromRequest.get) * 10 
    val to = from + 10 
    loadGameIds() 
    Ok(html.games(SteamStore.gamesIds(cache.getVal[JSONArray](GAME_KEY), from, to), cache.jsonArraySize(GAME_KEY)/10)) 
    } 


    private def loadGameIds(): Unit = { 
    val games = cache.get(GAME_KEY) 
    if (games.isEmpty) { 
     get(s"$GAME_IDS_LIST_API", asJsonGamesId) 
     cache.set(GAME_KEY, lastResponse.get, 60.minutes) 
    } 
    } 

は、クラスをインスタンス化するときにloadGameIdsが呼び出され、キャッシュされるだろうということです。

提案がありますか?

よろしくお願いいたします。

答えて

5

あなたの質問が正しく理解されていれば、メインのコンストラクタ本体にいくつかのステートメントを追加したいだけですか?そのような場合は、クラス本体で簡単に行うことができます。あなたのケースでは、それは次のようになります。

class SteamController @Inject()(cache: CacheApi) extends BaseController { 

    ... 

    private val GAME_KEY: String = "games" 

    loadGameIds() // <-- Here we are calling from the main constructor body 

    def games = Action { implicit request => 
    ... 
    } 

    ... 
} 

その際、彼らが適切であることを確認するために、後、あなたのクラスのすべてのヴァルスとVARSの宣言を追加コードを実行するために通常は良いアイデアです追加のコンストラクタコードが実行されるときに初期化されます。

+0

ありがとう、私はオブジェクトinit {loadGameIds}を試していましたが、何もありませんでした。それは私が読んだブログではそれを学んでいないという不思議なことです。 – paul

関連する問題