0

MVPパラダイムとGinでGWTを使用するプロジェクトがあります。発表者は 1 人ですが、今は別のビューが必要です (1 つは通常のユーザー用、もう 1 つは管理者用で、追加の列と異なるテキストを除いてほぼ同じものを表示します)。問題は、実行時に使用したいビューを選択したいということです。それは、ユーザーレベルを知っているからです。

GinMapBinderが見つかりました。これは、私が望むことをしているようです。コードには、インスタンス化する方法の例がありますが、使用方法についてはありません。

だから私の質問:これは私の問題を解決する方法ですか?これを使用する方法と、実行時にさまざまなインジェクションを選択する方法を説明する例を誰か教えてください。

4

1 に答える 1

3

GinMapBinderへのバインディングを段階的に構築できるため、それを使用java.util.Mapする方法は、オブジェクトに注入された を取得することです。Guice のjavadocに完全な例があり、同じように動作します。MapMapBinderGinMapBinder

質問に答えるには:

これは私の問題を解決する方法ですか?

Map<String, Provider<MyView>>ユーザーのロールであるキーを使用して a を注入すると、可能性があります。そのようなロールが 2 つしかない場合は、単純に 2 つの を注入し、ユーザーのロールに応じてProvider1 つを選択します。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();
  …
于 2013-08-21T10:30:59.270 に答える