2012-04-12 46 views
4

我已經按照this tutorial的建議實施了GWT應用程序。我還下載了示例代碼,並且我注意到演示的每個演示者都需要注入主演示器構造函數中以進行實例化。筆者在源包含在此:GWT /杜松子酒Presenter實例化

public class GreetingPresenter extends WidgetPresenter<GreetingPresenter.Display> { 

    // FUDGE FACTOR! Although this is not used, having GIN pass the object 
    // to this class will force its instantiation and therefore will make the 
    // response presenter listen for events (via bind()). This is not a very good way to 
    // achieve this, but I wanted to put something together quickly - sorry! 
    private final GreetingResponsePresenter greetingResponsePresenter; 

    @Inject 
    public GreetingPresenter(final Display display, final EventBus eventBus, final DispatchAsync dispatcher, final GreetingResponsePresenter greetingResponsePresenter) { 
      super(display, eventBus);  
      this.dispatcher = dispatcher;  
      this.greetingResponsePresenter = greetingResponsePresenter;  
      bind(); 
} 

我覈實,如有主持人沒有得到GreetingPresenter注射,也不會被實例化。出於演示的目的,這很酷,因爲整個應用程序只有兩個演示者,但在真實世界的應用程序中,這可能是一個嚴重的不便。

完成Presenter實例化的正確方法是什麼?

編輯:包括參考GIN相關類:

演示模塊:

public class GreetingClientModule extends AbstractPresenterModule { 

    @Override 
    protected void configure() {   
     bind(EventBus.class).to(DefaultEventBus.class).in(Singleton.class); 
     bind(PlaceManager.class).in(Singleton.class);  
     bindPresenter(GreetingPresenter.class, GreetingPresenter.Display.class, GreetingView.class); 
     bindPresenter(GreetingResponsePresenter.class, GreetingResponsePresenter.Display.class, GreetingResponseView.class);   
     bind(AppPresenter.class).in(Singleton.class); 
     bind(CachingDispatchAsync.class); 
    } 
} 

Ginjector:

@GinModules({ ClientDispatchModule.class, GreetingClientModule.class }) 
public interface GreetingGinjector extends Ginjector { 

    AppPresenter getAppPresenter(); 
    PlaceManager getPlaceManager(); 

} 

回答

2

我認爲你缺少你Ginjector和AbstractGinModule defini您可以從那個樣本中定義GIN綁定。
我建議從下面的教程中下載code,並查看GIN入門wiki

GreetingGinjector

@GinModules({ ClientDispatchModule.class, GreetingClientModule.class }) 
public interface GreetingGinjector extends Ginjector { 

    AppPresenter getAppPresenter(); 

    PlaceManager getPlaceManager(); 

} 

GreetingClientModule

public class GreetingClientModule extends AbstractPresenterModule { 

    @Override 
    protected void configure() {   
     bind(EventBus.class).to(DefaultEventBus.class).in(Singleton.class); 
     bind(PlaceManager.class).in(Singleton.class); 

     bindPresenter(GreetingPresenter.class, GreetingPresenter.Display.class, GreetingView.class); 
     bindPresenter(GreetingResponsePresenter.class, GreetingResponsePresenter.Display.class, GreetingResponseView.class); 

     bind(AppPresenter.class).in(Singleton.class); 
     bind(CachingDispatchAsync.class); 
    } 
} 

入口點

public class GreetMvp implements EntryPoint { 
    private final GreetingGinjector injector = GWT.create(GreetingGinjector.class); 

    public void onModuleLoad() { 
     final AppPresenter appPresenter = injector.getAppPresenter(); 
     appPresenter.go(RootPanel.get()); 

     injector.getPlaceManager().fireCurrentPlace(); 
    } 
} 
+0

我下載了源代碼並進行了測試,它包含了您提到的類。然而,GreetingResponsePresenter工作需要「FUDGE FACTOR」:S – 2012-04-12 21:10:56

3

你可以通過使用Providers來解決這個問題。在我的杜松子酒模塊我宣佈我的演示/活動與它一起的觀點是這樣

// Content Area 
    bind(ContentActivityMapper.class).in(Singleton.class); 

    // Intro Page 
    bind(IntroPageActivity.class); 
    bind(IntroPageView.class).to(IntroPageViewImpl.class).in(Singleton.class); 

然後在活動映射器I使用這樣

public class ContentActivityMapper implements ActivityMapper { 

    @Inject Provider<IntroPageActivity> introPageProvider; 

    public Activity getActivity(Place place) { 

     if (place instanceof DefaultPlace) { 
     return introPageProvider.get().withPlace(new IntroPagePlace()); 
     }... 

我已在withPlace方法建立在供應商ActivityPresenter允許它在沒有參數的情況下被注入。該代碼看起來像這樣。

public class IntroPageActivity extends AbstractActivity { 

    private IntroPageView view; 

    @Inject 
    public IntroPageActivity(IntroPageView view) { 
     super(); 
     this.view = view; 
    } 

    public IntroPageActivity withPlace(IntroPagePlace place) { 
     return this; 
    } 

    @Override 
    public void start(AcceptsOneWidget containerWidget, EventBus eventBus) { 
     containerWidget.setWidget(view.asWidget()); 
    }... 
+0

所用的MVP框架已經具備了Presenter/Display注入的功能(參見另一個答案)。但是,我們仍然需要每個演示者作爲應用程序主要演示者的參數:S – 2012-04-13 16:03:09

+0

我沒有在示例中顯示它們,但我在此應用程序中有大約20個不同的活動/演示者。我不需要將它們嵌入到主持人中。這就是我所需要的,它們都是根據需要創建的,甚至可以與AsyncProvider類一起使用來進行代碼分割。 – Deanna 2012-04-13 16:12:48

+0

我想用GWTP做到這一點,但我的提供程序總是未定義..父Presenter聲明'@Injected提供程序 myAbc'但似乎丟失。任何想法可能是什麼問題? – displayname 2016-03-12 15:58:29

相關問題