サブプロジェクトの 1 つに単一のプレゼンター用の複数のビューがあるマルチプロジェクト アプリケーションをまとめようとしています。Gin を使用してプレゼンターにビューを挿入しています。
サブプロジェクトには、プレゼンターと 2 つの異なるビューが含まれています。2 つの個別の gin モジュールがあり、それぞれがビューの 1 つをビュー インターフェイスにバインドします。
この投稿への回答に関する Thomas Broyer の提案に従って、私の Ginjector は、特定の ginjector で GWT.create を呼び出す「ホルダー」クラスにラップされています。適切なホルダーは、replace-with ステートメントを使用して gwt.xml ファイルで構成されます。
プロジェクトを開発モードで実行すると、別のビューが期待どおりに表示されます。ただし、プロジェクトをコンパイルすると、デフォルトのビューしか表示されません。また、順列は 6 つしかなく (replace-with ロジックのためにもっと多いと予想されます)、さまざまなシナリオで期待するビューが得られません。
説明するコードを次に示します。
Subproject.gwt.xml には次のものが含まれます。
<replace-with class="com.example.GinjectorDesktopHolder">
<when-type-is class="com.example.GinjectorHolder" />
</replace-with>
<replace-with class="com.example.GinjectorTabletHolder">
<when-type-is class="com.example.GinjectorHolder" />
<when-property-is name="formfactor" value="tablet" />
</replace-with>
「formfactor」変数は、GWT の mobilewebappサンプル プロジェクトからそのままコピーされた gwt.xml で定義されています。
ホルダー クラスは次のようになります。
public abstract class GinjectorHolder {
public abstract Ginjector getGinjector();
}
public class GinjectorTabletHolder extends GinjectorHolder {
@Override
public Ginjector getGinjector() {
return GWT.create(GinjectorTablet.class);
}
}
public class GinjectorDesktopHolder extends GinjectorHolder {
@Override
public Ginjector getGinjector() {
return GWT.create(GinjectorDesktop.class);
}
}
私のジンジェクターは次のようになります。
public interface MyGinjector {
MyView getView();
EventBus getEventBus();
}
@GinModules({ModuleDesktop.class})
public interface GinjectorDesktop extends Ginjector, MyGinjector {}
@GinModules({ModuleTablet.class})
public interface GinjectorTablet extends Ginjector, MyGinjector {}
私のモジュールは次のようになります。
public class ModuleDesktop extends AbstractGinModule {
@Override
protected void configure() {
bind(MyPresenter.View.class).to(DesktopView.class);
}
}
public class ModuleTablet extends AbstractGinModule {
@Override
protected void configure() {
bind(MyPresenter.View.class).to(TabletView.class);
}
}
最後に、私のプレゼンター プロキシでは、基本的にこの特定のサブプロジェクトへのエントリ ポイントに、次の行があります。
GinjectorHolder holder = GWT.create(GinjectorHolder.class);
MyGinjector ginjector = holder.getGinjector();
前述のように、Dev Mode で実行してブレークポイントを設定すると、適切な GinjectorHolder が作成されていることがわかります。FormFactor.gwt.xml (上記のリンク) は、URL パラメーターを使用して表示したいコンテキストに切り替えるためのスイッチを提供します。したがって、URL で formfactor=tablet を実行すると、Tablet Ginjector ホルダーが作成されます。