GinMapBinder
へのバインディングを段階的に構築できるため、それを使用java.util.Map
する方法は、オブジェクトに注入された を取得することです。Guice のjavadocに完全な例があり、同じように動作します。Map
MapBinder
GinMapBinder
質問に答えるには:
これは私の問題を解決する方法ですか?
Map<String, Provider<MyView>>
ユーザーのロールであるキーを使用して a を注入すると、可能性があります。そのようなロールが 2 つしかない場合は、単純に 2 つの を注入し、ユーザーのロールに応じてProvider
1 つを選択します。get()
(以下も参照)
それは私がそれをする方法ではありません。遅延バインディング(通常のユーザーと管理ユーザーに個別の順列を生成するため)、実行時に適切な順列を選択するためのプロパティ プロバイダー、および動的ホスト ページ(サーバーからクライアントが起動する前のクライアント)。
遅延バインディングを使用して、使用する Ginjector を選択します (ファクトリと<replace-with>
ルールを使用)。@GinModules
;を除いて、Ginjector は同一です (基本インターフェースから継承された同じメソッド) 。したがって、通常のユーザーGinModule
用と管理者ユーザー用の をそれぞれ持つことができ、それぞれがMyView.class
別個の実装クラスに。
これを使用する方法と、実行時にさまざまなインジェクションを選択する方法を説明する例を誰か教えてください。
実装を表示するためのユーザー ロールをバインドするマップを作成します。
GinMapBinder<String, MyView> mapBinder =
GinMapBinder.newMapBinder(binder(), String.class, MyView.class);
mapBinder.addBinding("normal").to(MyViewImplNormal.class);
mapBinder.addBinding("admin").to(MyViewImplAdmin.class);
次に、ユーザーの役割とともにそれを挿入します。
@Inject MyPresenter(@Named("user.role") String userRole,
Map<String, Provider<MyView>> views) {
ユーザーの役割に応じて適切なビューを選択します。
// TODO: handle the case where the map has no value for the user role
this.view = views.get(userRole).get();
…
私が話していた代替案:
bind(MyView.class).annotatedWith(named("user.normal")).to(MyViewImplNormal.class);
bind(MyView.class).annotatedWith(named("user.admin")).to(MyViewImplAdmin.class);
…
@Inject MyPresenter(@Named("user.isAdmin") boolean isAdmin,
@Named("user.normal") Provider<MyView> normalView,
@Named("user.admin") Provider<MyView> adminView) {
this.view = isAdmin ? adminView.get() : normalView.get();
…