在我的设计中,我希望有一个视图/演示器对,其中演示器是一个扩展的抽象类。例如,我的设计包含一堆问题,每次只问一个。我可能有一个视图/演示者对是/否的问题。我希望有一个YesOrNo演示器,带有抽象方法,如getQuestion onYes onNo。这个演示者的显示将设置问题,重载的ibinderhandler将调用onYes和onNo。然后我可以用HasDogYesOrNo presenter扩展YesOrNo presenter,它将包含如果用户有一只狗该怎么做的业务逻辑。我可能有类似的HasCatYesOrNo.
所以我创建了两个类来扩展泛型YesNoPresenter<T extends Proxy<?>> extends Presenter<YesNo.MyView, T>
然后我定义了像
这样的类public class HasCatsYesNoPresenter extends YesNoPresenter<HasCatsYesNoPresenter.MyProxy>
当我要绑定它们时,我有
bindPresenter(YesNoPresenter.class, YesNoPresenter.MyView.class, YesNoView.class,
HasCatsYesNoPresenter.MyProxy.class);
bindPresenter(YesNoPresenter.class, YesNoPresenter.MyView.class, YesNoView.class,
HasDogsYesNoPresenter.MyProxy.class);
但是我得到了一个错误
$MyView is Double-bound: Bound at com.gwtplatform.mvp.client.gin.AbstractPresenterModule ...
似乎我不能将两个演示者绑定到同一个视图?我真的很想重用视图,但在它们背后放置不同的业务逻辑。在GWTP中是否有更好的方法来做到这一点?我的必备功能是使用不同的业务逻辑演示器重用相同的视图,并使每个业务逻辑演示器都可添加书签。我也希望我的业务逻辑演示器是匿名类,但这可能要求太多了。
对于简单的YesNo案例,还有其他方法可以实现我的演示器,但是我有一些更复杂的演示器,我认为重用代码的最佳方法是用该演示器所需的逻辑扩展基本演示器。yesnopresenter只是一个例子。
我相信[正如Renaud所说,您正在寻找使用PresenterWidget
。然而,我也认为你想做的事情只需要演讲者就可以做到。
你可以做的是为每个child-presenter声明一个视图接口(如果你想在它们之间共享一些逻辑,这些子视图接口可以扩展父视图接口)
也就是
(注意"->"表示"取决于")
ParentPresenter -> ParentView
ParentViewImpl implements ParentView
ChildPresenter1 -> ChildView1 extends ParentView
ChildPresenter2 -> ChildView2 extends ParentView
bind(ChildView1).to(ParentViewImpl)
bind(ChildView2).to(ParentViewImpl)
// and then you would have to bind your proxies manually
bind(MyProxy1.class).asEagerSingleton();
bind(MyProxy2.class).asEagerSingleton();
这样你就可以
明白了吗?
在多个演示器中重用视图的最佳方法是创建一个带有其关联视图的presententerwidget,并将其注入所需的演示器中。
我的必备功能是重用具有不同业务逻辑演示器的相同视图,并使这些业务逻辑演示器中的每个都是可书签的
这就是PresenterWidget的作用。下面是一个可以在整个应用程序中重用的PresenterWidget的具体示例。
bindPresenter
快捷方法不是用来处理您的用例的。我相信你想做的是:
bind(HasCatsYesNoPresenter.class).in(Singleton.class);
bind(HasCatsYesNoPresenter.MyProxy.class).asEagerSingleton();
bind(HasDogsYesNoPresenter.class).in(Singleton.class);
bind(HasDogsYesNoPresenter.MyProxy.class).asEagerSingleton();
bind(YesNoPresenter.MyView.class).to(YesNoView.class);
视图绑定不是单例绑定,以确保在每个呈现器中注入一个新的视图实例。