エントリ ポイントで依存関係を挿入するために GIN を使用する webapp があります。
private InjectorService injector = GWT.create(InjectorService.class);
@GinModules({PlaceContollerInject.class, RootViewInject.class})
public interface InjectorService extends Ginjector {
RootView getRootView();
PlaceController getPlaceConroller();
}
public class RootViewInject extends AbstractGinModule {
@Override
protected void configure() {
bind(RootView.class).to(RootViewImpl.class);
}
}
別の RootView 実装を使用するモバイル バージョンが必要です。依存関係は、次のモジュールで説明されています
public class RootViewMobileInject extends AbstractGinModule {
@Override
protected void configure() {
bind(RootView.class).to(RootViewMobileImpl.class);
}
}
問題は、モバイル バージョンまたはデフォルト バージョンのどちらが必要かを条件付きで依存関係を選択する方法です。GWT-GIN Multiple Implementationsを見たことがありますが、プロバイダーが依存関係のチェーンを壊し、Factory パターンがテスト可能性を壊すため、その解決策を見つけていません。こちらの「Guice を使用した Big Modular Java」ビデオ(12 分) では、モジュールを使用した Guice のインジェクターが Factory の代替として紹介されました。したがって、私の質問は、アプリのモバイル バージョンとデフォルト バージョン (MobileFactory や DefaultFactory など) 用に異なる Ginjector を作成する必要があるか、それとも悪い習慣であり、必要なすべてのバージョンで Ginjector の 1 つのインスタンスを構成する必要があるかということです。たとえば、このような注釈バインディングを使用します。
public class RootViewMobileInject extends AbstractGinModule {
@Override
protected void configure() {
bind(RootView.class).annotatedWith(Mobile.class).to(RootViewMobileImpl.class);
}
}
GWT エントリ ポイントで @Mobile アノテーション付きバインディングを使用する
@Inject
private void setMobileRootView(@Mobile RootView rw) {
this.rw = rw;
}
上記のような単純化された例では、可能かもしれません。ただし、アプリケーションに、モバイル バージョンとデフォルト バージョンを必要とする依存関係がさらにある場合。テスト不可能な「醜い」(Guiceのプレゼンテーションで言われたように)工場に戻ったようです。私の英語でごめんなさい。どんな助けでも大歓迎です。