2016-10-01 2 views
2

Ich habe einen Controller mit einem Konstruktor, wo ich einen Cache injiziere, aber ich möchte auch eine Methode im Konstruktor aufrufen, wenn die Instanz erstellt wird. Ich weiß, dass wir einigen Hilfsbauer mitCall-Methode im Konstruktor

def this(foo:Foo){} 

Aber in meinem Fall schaffen können, weil das eine Spiel-Framework, das Beispiel meiner Bootstrap ein wenig komplexer sind.

Hier mein Code

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) 
    } 
    } 

Was würde Ich mag ist, dass loadGameIds aufgerufen werden würde und zwischengespeichert, wenn die Klasse instanziiert wird.

Irgendwelche Vorschläge?

Grüße.

Antwort

5

Wenn ich Ihre Frage richtig verstehe, möchten Sie einfach einige Anweisungen zum Hauptkonstruktorkörper hinzufügen? Wenn das der Fall ist, können Sie dies einfach im Körper der Klasse selbst tun. In Ihrem Fall, dass würde wie folgt aussehen:

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 => 
    ... 
    } 

    ... 
} 

Dabei ist es in der Regel eine gute Idee, zusätzlichen Code nach die Deklaration aller vals und Vars in der Klasse durchzuführen, um sicherzustellen, dass sie richtig wird zu dem Zeitpunkt initialisiert, zu dem Ihr zusätzlicher Konstruktorcode ausgeführt wird.

+0

Vielen Dank Ich habe versucht Objekt init {loadGameIds} aber nichts. Das ist seltsam, dass ich das in keinem Blog, den ich gelesen habe, gelernt habe. – paul