2012-04-12 4 views
4

this tutorial의 권장 사항에 따라 GWT 응용 프로그램을 구현했습니다. 또한 샘플 코드를 다운로드했는데 데모의 모든 발표자가 주 발표자 생성자에 삽입되어 인스턴스화되어야한다는 것을 알았습니다. 저자는 원본이 포함 :GWT/Gin Presenter 인스턴스화

내가 어떤 발표자가 GreetingPresenter 주입되지 않을 경우, 인스턴스화되지 않는다는 것을 확인
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(); 
} 

. 데모 용으로는 전체 앱에 두 명의 발표자 만 있기 때문에 멋지지만 실제 응용 프로그램에서는 심각한 불편을 겪을 수 있습니다.

Presenter 인스턴스화를 수행하는 적절한 방법은 무엇입니까?

발표자 모듈 :

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 및 누락 생각

편집 : 참조 GIN 관련하는 클래스가 포함 AbstractGinModule 정의 그 샘플에서 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 –

3

당신 공급자를 사용하여이 문제를 해결할 수 있습니다. 내 진 모듈에서 내가 함께 내 발표자/활동 선언이

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

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

같은 뷰가 그런 활동 매퍼에 나는 내가 withPlace의 방법에 설정 한이

public class ContentActivityMapper implements ActivityMapper { 

    @Inject Provider<IntroPageActivity> introPageProvider; 

    public Activity getActivity(Place place) { 

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

같은 공급자를 사용입니다 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 –

+0

이 예제에서는 표시하지 않았지만이 응용 프로그램에는 약 20 개의 다른 활동/발표자가 있습니다. 나는 그 (것)들을 maim 증여자에 끼워 넣을 필요 없다. 필요한 모든 것 뿐이고 필요에 따라 생성되며 AsyncProvider 클래스를 사용하여 코드 분할을 수행합니다. – Deanna

+0

GWTP를 사용하여이 작업을 수행하려하지만 공급자가 항상 정의되지 않았습니다. 부모 Presenter가'@Injected Provider myAbc'을 선언하지만 무언가가 누락 된 것처럼 보입니다. 문제가 뭔지 알 겠어? – displayname