Twirl模板能夠使用class的構造函數方式生成(在template開始處使用 @this(args)語法),而不必定要用object的靜態方法。這意味着你能夠將Twirl的模板注入到controllers。將控制權從controllers中反轉出來。這意味着能夠將Twirl模板直接注入到控制器中,由模板來管理本身的依賴,而不是由控制器來管理依賴項以及須要渲染的模板。html
舉個栗子,假設一個模板依賴了Summarizer組件,並被另外一個controller引用:java
trait Summarizer { /** Provide short form of string if over a certain length */ def summarize(item: String) }
建立一個 app/views/IndexTemplate.scala.html 並使用 @this 構造函數:app
@this(summarizer: Summarizer) @(item: String) @{summarizer.summarize(item)}
最後使用構造函數注入來定義controller:ide
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,你須要手動加上以下依賴注入的設置:this
TwirlKeys.constructorAnnotations += "@javax.inject.Inject()"
而在Play應用已經爲你默認設置好了一切。 .net