2012-02-09 7 views
1

私はGWT/GINで私の最初のステップをしようとしています。GWT - binding activityMapper with GIN not working

Googleからhellomvpのサンプルをダウンロードしてから、に従ってください.Ginを使い始めるには

私の問題はHelloGinModule級の通信設定方法では、この行についてです:私の視点で

bind(ActivityMapper.class).to(AppActivityMapper.class).in(Singleton.class); 

それがアクティブActityManagerとして私のクラス「AppActivityMapper」をバインドする必要があります。 実際、クラスコンストラクタ(またはクラスの任意のメソッド)は決して呼び出されないので、起動されたイベントは捕捉されません。

AppActivityMapperは次のようになりますクラス:私の例では

public class AppActivityMapper implements ActivityMapper { 

     Provider<HelloActivity> helloActivityProvider; 
     Provider<GoodbyeActivity> goodbyeActivityProvider; 

     @Inject 
     public AppActivityMapper(final Provider<HelloActivity> helloActivityProvider, final Provider<GoodbyeActivity> goodbyeActivityProvider) { 
      this.helloActivityProvider = helloActivityProvider; 
      this.goodbyeActivityProvider = goodbyeActivityProvider; 
     } 


     @Override 
     public Activity getActivity(Place place) { 
      if (place instanceof HelloPlace) { 
       return helloActivityProvider.get(); 
      } else if (place instanceof GoodbyePlace) { 
       return goodbyeActivityProvider.get();    
      } 

      return null; 
     } 
} 

私のビュークラスから、このコードは、リンクをクリックした後に呼び出されます。

presenter.goTo(new GoodbyePlace(name)); 

イベントがイベントに発射されますバス。しかし、何も起こりません。事前

答えて

1

おかげであなたはGINのどこかで活動マッパーを定義しています。しかし、活動マッパーはアクティビティー・マネージャーで使用する必要があります。 AppActivityMapperを使用するアクティビティマネージャはどこで作成しますか? 更新

もっとも論理的なことは、アクティビティマネージャをジンの外に保つことです。例えば。あなたはginjectorインスタンスを作成するとき、あなたはマネージャーを作成してそこに正しい活動マッパーを置くことができ、

interface MyInjector extends Ginjector { 
    ... //other methods 

    ActivityMapper getActivityMapper(); 

} 

より:あなたのginjectorにあなたはメソッドを持つことになります。例えば:あなたは複数のマネージャとマッパーを持っている場合は

MyInjector injector = GWT.create(MyInjector.class); 
    ActivityManager manager = new ActivityManager(injector.getActivityMapper(), injector.getEventBus()); 

は、(あなたがそのコンストラクタにものを注入することができる)ActivityManagerクラスを拡張した方が良いでしょうかもしれません。別の解決策は、@Providesを使用してActivityManagerを初期化することです。

+0

ok、私はそれがポイントだと思います。私はActivityMapperとActivityManagerの違いを知りませんでした。 アクティビティマネージャを定義するベストプラクティスは何ですか? – Lodger

+0

@Lodger私の投稿を更新しました – jusio

+0

別のオプションは、おそらくGin/Guiceを使用するアイデアと緊密に従って、ActivityManagerのモジュールにプロバイダまたは@Providesメソッドを定義することです。サンプルgwt/ginプロジェクトの1つの例https://github.com/niloc132/tvguide-sample-parent/blob/master/tvguide-client/src/main/java/com/acme/gwt/client/ioc/ TvGuideClientModule.java#L98 –