質問
私はウエブアプを使用するジン注入依存関係で入ります。
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-銀複数の実装, ものだそうで解決のプロバイダからの依存関係の'チェーンをパターンを改testability."の大きなモジュラージャワGuice"ビデオ こちら(12分) Guiceのインジェクターとモジュールとして、差し替え工場です。その後、私の質問は、必をGinjectorモバイルおよびデフォルトバージョン(MobileFactoryとDefaultFactory)のアプリで悪の実践という設定を一つのインスタンスGinjector切に対応できます。例えば、注釈のバインディング。
public class RootViewMobileInject extends AbstractGinModule {
@Override
protected void configure() {
bind(RootView.class).annotatedWith(Mobile.class).to(RootViewMobileImpl.class);
}
}
利用@モバイル叢のバインディングでGWTのエントリポイント
@Inject
private void setMobileRootView(@Mobile RootView rw) {
this.rw = rw;
}
などの簡単な例を次に示し上記でも可能です。がる場合、アプリケーションして依存関係を必要とするモバイルおよびデフォルトできます。のようになバuntestable"醜い"として処理しているGuiceした発表を行い)。にたどり着きました。.のお役に立てるようよろしくお願いいたします。
解決
ダウンロードいただけま通りを少し入った場所に使用GWT繰延結合、クラスの交換を結合する異なるバージョンのInjectorServiceによって、ユーザーエージェント.このため、モバイル版のみのモバイル実装の作成(およびダウンロード)
あるいはInjectorServiceDesktop,InjectorServiceMobile、両方から新たな方法論を提供することInjectorService、GWT.create(InjectorService.classとしたうえで、繰延結合を決定する実装できます。
http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsDeferred.html#replacement
一つのインスタンスGinjectorすべてのバージョンのように悪いのですべてのコードの両方のバージョンは常にダウンロード(お確かないダウンロードすべてのデスクトップに込めモバイルアプリ)
編集:してトーマスポイントにコメントはインジェクターは生成されたクラスだけの各InjectorServiceXXX内プホルダークラスGWT.create()'s のInjectorServiceXXX用の交換"を切り替えることが保有する
他のヒント
GINモジュールに注釈が付けられている一般的なインジェクターインターフェイスが抽象的なジンモジュールを指すことはできないため、あなたが望むことをすることは実際にはかなり複雑です。 Ginjectorインターフェイスによって指されたジンモジュールは、具体的なものでなければなりません。コンクリートモジュールは、複数の構成を同時に満たすことができません。
したがって、(a)デスクトップアプリケーションのために、Ginjectorインターフェイス、クライアントギニジェクターとモジュール、クライアントモジュールなどのGinjectorインターフェイスを作成します。
(b)2番目のGinjectorインターフェイスを作成し、(a)で作成したものを拡張しますが、Ginmodule Annotationが異なるモジュールを指して拡張します。
- これで、2つのGinjeCorインターフェイスがあり、タブレット用のデフォルトのインターフェイスとセカンダリのインターフェイスがあり、それぞれが独自のconfigure()実装を備えたモジュールを指しています。
(c)今度は、正しいGinjectorの実装を取得するために工場を作成する必要があります。これを行うことができます。これは、(a)および(b)で有信になっているジンチャターには、(a)で作成されたデフォルトのインターフェイスである共通のデモニタドールを持っているためです。したがって、次のようなメソッドを使用して抽象的な包囲を作成します。デスクトップ/デフォルトのギニジェクターを取得するために2人の子供のコンクリートクラスを作成し、もう1人はタブレットギニジェクターを取得します。
(d)これで、YouTubeのGoogle IOと同じようにモジュールのGWT.xmlを構成し、ランタイム中に希望する包囲を取得する必要があると説明します。
(e)エントリーポイントでは、揚げ物をGWT Deferred Bindingを使用してGinjectorではなくGinjectorの工場を取得することではなく、揚げ物を取得することです。 clientginjector、セットを返す抽象メソッドを呼び出します。
(f)最後の壮大な失敗。 Guiceは、異なるインジェクター(デスクトップ用、タブレット用に1つ)を使用する場合でも、同じキー(クラスと注釈)の2倍にバインドすることはできません。キーバインディングの定義はグローバルであるように思われます。同じキーを再定義する2つのモジュールがあるとすぐに、冒険の終わりです。