2012-04-12 45 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

相关问题