§テンプレートにおける依存性注入
Twirlテンプレートは、テンプレートの先頭に特別な `@this(args)` 構文を使用してコンストラクタを宣言することにより、静的オブジェクトではなくクラスとして生成できます。 つまり、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アプリケーション内では、これはすでにデフォルト設定に含まれています。
次: 一般的なユースケース
このドキュメントに誤りを見つけましたか? このページのソースコードはこちらにあります。 ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。 質問やアドバイスがあれば、コミュニティフォーラムにアクセスして、コミュニティとの会話を始めてください。