Injectアノテーションの他に何も情報を与えなくても、 適切なオブジェクトやサービスがインジェクトできるようにTapestryは尽力します。
多くの場合、利用可能なIoCサービスの中からフィールドの型と一致するものが選ばれます。
該当するサービスがIoCレジストリ内にひとつしかなければ、そのサービスが選ばれます。
該当するサービスが複数見つかった場合はそれらのうちどのサービスをインジェクトするのか、曖昧さを解決しなければなりません。 (全てのインジェクションに対する)グローバルな曖昧さ解決を行うには、サービスインターフェースから特定のサービスへ結びつくエイリアスを作成しなければなりません。
これは、Aliasサービスへの登録という形で行われます。
Aliasサービスには別の目的があります: ひとつは、アプリケーションの動作モードに基づいてインジェクトされるサービスを一時的にオーバーライドできるようにすることです。 今のところ動作モードは "servlet" しかありませんが、将来的には "portlet" モードが利用可能になるでしょう。 さらに、"offline" モードというものもできるかもしれません。
ふたつめは、AliasOverridesサービスで一時的に特定のサービスをオーバーライドできるということです。 これによりIoCレジストリ内のサービスのネットワークを乱すことなくサービスを一時的にオーバーライドすることができます。
あるサービスをAliasサービスに登録するには、まず登録しようとするサービスを論理名で特定します。 多くの場合、この論理名はそのサービスが実装しているサービスインターフェースと同じ名前がつけられています。
次に、Infrastructureサービスに登録します (訳注:Infrastructureサービスって何? 原文:You can then contribute into the Infrastructure service's configuration) :
public static void contributeAlias(@InjectService("MyService") MyService myService, Configuration<AliasContribution> configuration) { configuration.add(AliasContribution.create(MyService.class, myService)); }
上の例はよくあるパターンを示しています: InjectServiceアノテーションを明示的に使用して、 エイリアスの登録をしようとしているサービスを登録メソッドの引数にインジェクトしています。 そして、サービスの型に対してエイリアスの登録を行います。
エイリアスの登録ができるのはサービスだけではありません; 登録メソッド内でオブジェクトのインスタンスを普通に生成し、それを登録することもできます。 上の例では、new の代わりに create() というstaticメソッドを使っています(それは、ただJavaのジェネリクスの醜さを取り除くためにそうしています)。
あるサービスをオーバーライドするには、そのサービスのサービスインターフェース名を知っている必要があります。
次に、上で述べたエイリアスの登録と同じようにしてAliasOverridesサービスに登録します。
オーバーライドとして登録されたオブジェクトはデフォルトの登録を隠します。