【问题标题】:GWTP and abstract presenter classesGWTP 和抽象演示者类
【发布时间】:2015-09-04 17:30:20
【问题描述】:

在我的设计中,我想要一个视图/演示者对,其中演示者是一个可以扩展的抽象类。例如,我的设计包含一堆问题,每次都会被问到一个问题。对于是/否问题,我可能有一对视图/演示者。我希望有一个 YesOrNo 演示者,它具有 getQuestion、onYes、onNo 等抽象方法。这个演示者的揭示会提出问题,重载的 uibinderHandlers 会调用 onYes 和 onNo。然后,我可能会使用 HasDogYesOrNo 演示器扩展 YesOrNo 演示器,该演示器将包含有关如果用户有狗该怎么办的业务逻辑。 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 只是一个例子。

【问题讨论】:

  • 我看到我只需要将演示者绑定到代理,然后 bindSharedView 将基本演示者绑定到视图。但是现在我很困惑基础演示者(抽象)类应该扩展什么?我问是因为代理应该在presenterImpl类中,但视图在基类中?

标签: java gwt gwtp gwt-platform


【解决方案1】:

我相信 [正如 Renaud 所说,您希望使用 PresenterWidget。但是我也认为只有 Presenters 才能实现您想要做的事情。

您可以做的是为每个子演示者声明 1 个视图接口(如果您想在它们之间共享一些逻辑,这些子视图接口可以扩展父视图接口)

所以你会有

(注意“->”的意思是“取决于”)

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();

这样你就可以

这有意义吗?

【讨论】:

    【解决方案2】:

    在多个 Presenter 中重用 View 的最佳方法是创建一个 PresenterWidget 及其关联的 View,并将其注入到您需要的 Presenter 中。

    我的必备条件是使用不同的业务逻辑展示器重用相同的视图,并让每个业务逻辑展示器都可以收藏

    这正是PresenterWidget 的用途。这是可以在整个应用程序中重用的 PresenterWidget 的具体 example。

    【讨论】:

    • 我看不到 2 个(或更多)不同的presenterWidget 如何通过presenterWidget 链接到同一个视图。每个 PresenterWidget 仍然需要链接到一个 View 并且如何将两个 Presenter 小部件链接到同一个视图并不明显。
    • 我看到的方式是使用 PresenterWidget 来重用同一个 View,而不是试图将同一个 View 链接到不同的 Presenter。
    【解决方案3】:

    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);
    

    视图绑定不绑定在单例中,以确保将视图的新实例注入每个演示者中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多