2016-10-01 3 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 => 
    ... 
    } 

    ... 
} 

При этом, как правило, это хорошая идея, чтобы выполнить дополнительный код после декларации все вальса и Варса в своем классе, чтобы гарантировать, что они должным образом инициализируется на момент запуска вашего дополнительного кода конструктора.

+0

Большое спасибо, я пытался объект init {loadGameIds}, но ничего. Это странно, что я не узнал об этом в любом блоге, который я читал. – paul

Смежные вопросы