【四 Twirl模板引擎】 2. 模板的依賴注入 原

Twirl模板可以使用class的構造函數方式生成(在template開始處使用 @this(args)語法),而不一定要用object的靜態方法。這意味着你可以將Twirl的模板注入到controllers。將控制權從controllers中反轉出來。這意味着可以將Twirl模板直接注入到控制器中,由模板來管理自己的依賴,而不是由控制器來管理依賴項以及需要渲染的模板。

舉個栗子,假設一個模板依賴了Summarizer組件,並被另一個controller引用:

trait Summarizer {
  /** Provide short form of string if over a certain length */
  def summarize(item: String)
}

創建一個 app/views/IndexTemplate.scala.html 並使用 @this 構造函數:

@this(summarizer: Summarizer)
@(item: String)

@{summarizer.summarize(item)}

最後使用構造函數注入來定義controller:

public MyController @Inject()(template: views.html.IndexTemplate, 
                              cc: ControllerComponents) 
  extends AbstractController(cc) {
  
  def index = Action { implicit request =>
    val item = "some extremely long text"
    Ok(template(item))
  }
}

一旦定義了模板,controller就可以注入它,但是 summarizer 對controller是不可見的。

如果你需要在Play項目以外使用Twirl,你需要手動加上如下依賴注入的設置:

TwirlKeys.constructorAnnotations += "@javax.inject.Inject()"

而在Play應用已經爲你默認設置好了一切。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章