文档

§模板中的依赖注入

通过在模板顶部使用特殊的 @this(args) 语法声明构造函数,Twirl 模板可以生成一个类而不是一个静态对象。这意味着 Twirl 模板可以直接注入到控制器中,并且可以管理自己的依赖项,而不是控制器必须不仅管理自身依赖项,还要管理它必须渲染的模板的依赖项。

例如,假设一个模板依赖于一个组件 Summarizer,而控制器不使用该组件。

public interface Summarizer {
  /** Provide short form of string if over a certain length */
  String summarize(String item);
}

使用 @this 语法为构造函数创建一个文件 app/views/IndexTemplate.scala.html

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

@{summarizer.summarize(item)}

最后,通过在构造函数中注入模板来在 Play 中定义控制器

public class MyController extends Controller {
  
  private final views.html.IndexTemplate template;

  @Inject
  public MyController(views.html.IndexTemplate template) {
    this.template = template;
  }

  public Result index() {
    String item = "some extremely long text";
    return ok(template.render(item));
  }

}

一旦模板及其依赖项定义完毕,控制器就可以将模板注入到控制器中,但控制器看不到 Summarizer。

如果您在 Play 应用程序之外使用 Twirl,则需要手动添加 @Inject 注解,表明此处应使用依赖注入。

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

在 Play 应用程序中,这已包含在默认设置中。

下一步: 常见用例


发现此文档中的错误?此页面的源代码可以在 此处 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?前往 我们的社区论坛 与社区进行交流。