您对构建GWT应用程序的建议是什么?MVC,MVP或自定义消息传递解决方案?

Mat*_*ble 25 architecture model-view-controller mvp gwt puremvc

我刚刚为客户启动了一个新的GWT项目,我很想听听人们对各种GWT MVC架构的体验.在最近的一个项目中,我使用了GXT MVC以及自定义消息传递解决方案(基于Appcelerator的MQ).GXT MVC工作正常,但对GWT来说似乎有点过分,并且难以使用浏览器历史记录.我听说过PureMVCGWTiger,但从未使用它们.我们的定制MQ解决方案工作得很好,但是很难用JUnit测试组件.

另外,我听说Google Wave(GWT应用程序)是使用Model-View-Presenter模式编写的.最近发布了一个示例MVP应用程序,但是看一下代码,它似乎并不直观.

如果您正在构建新的GWT应用程序,您将使用哪种架构?您选择的利弊是什么?

谢谢,

马特

Dhr*_*ruv 17

值得注意的是,谷歌终于写出了使用mvp架构进行设计的教程.它阐明了上面列出的google i/o talk中的许多元素.拿一个厕所:https://developers.google.com/web-toolkit/articles/mvp-architecture


Sak*_*aba 11

我很高兴这个问题被提出来,因为GWT desperatley需要一种类似于rails的结构化应用程序的方式.基于最佳实践的简单方法,适用于所有用例的90%,并且具有超级易测试性.

在过去的几年里,我一直在使用我自己的MVP实现,这是一种非常被动的观点,它将自己奴役到Presenter告诉他要做的事情.

我的解决方案包括以下内容:

  • 每个窗口小部件的接口,用于定义控制视觉外观的方法
  • 可以是Composite的实现类,也可以使用外部窗口小部件库
  • 屏幕的中央Presenter,用于承载由M个小部件组成的N个视图
  • 每个屏幕的中央模型,用于保存与当前视觉外观相关的数据
  • 像"SourcesAddEvents [CustomerDTO]"这样的通用监听器类(编辑器不喜欢这里的java泛型的真实符号,所以我使用了thoe括号),因为否则你会有很多相同的接口,它们只是因类型而不同

视图获取对演示者的引用作为其构造函数参数,因此他们可以使用演示者初始化它们的事件.演示者将处理这些事件并通知其他窗口小部件/视图,或者调用gwt-rpc,成功时将其结果放入模型中.该模型具有典型的"Property [List [String]] names = ...."属性更改侦听器机制,该机制向演示者注册,以便gwt-rpc请求对模型的更新转发到所有视图/小部件感兴趣.

有了这个appraoch,我已经使用EasyMock为我的AsynInterfaces提供了非常简单的可测试性.我还能够轻松地交换视图/小部件的实现,因为我必须重写的是通知演示者某些事件的代码 - 无论底层小部件(按钮,链接等).

我的方法有问题:

  • 我目前的实现使得很难在不同屏幕的中央模型之间同步数据值.假设您有一个显示一组类别的屏幕和另一个允许您添加/编辑这些项目的屏幕.目前很难在屏幕边界传播这些变化事件,因为这些值缓存在这些模型中,很难找到我们是否有些东西是脏的(在传统的web1.0-html中很容易具有服务器端声明性缓存的-dumb-terminal类场景.
  • 视图的构造函数参数可以实现超级简单的测试,但是如果没有可靠的依赖注入框架,则会在"onModuleLoad()"中包含一些UGLY工厂/设置代码.当我开始这个时,我不知道谷歌GIN,所以当我重构我的应用程序时,我会用它来摆脱这个样板.这里有一个有趣的例子是GIN-Trunk中的"HigherLower"游戏.
  • 我没有第一次获得正确的历史记录,因此很难从我的应用程序的一部分导航到另一部分.我的方法并不了解历史,这是一个严重的衰退.

我对这些问题的解决方案:

  • 使用GIN删除难以维护的设置样板
  • 从Gwt-Ext转移到GXT时,使用其MVC框架作为EventBus来附加/分离模块化屏幕,以避免缓存/同步问题
  • 想想某种"地方" - 像Ray Ryan在I/O 09的演讲中所描述的那样的抽象,它将GXT-MVC与GWT之间的事件差距联系起来 - Hitory方法
  • 将MVP用于小部件以隔离数据访问

摘要:

我不认为可以使用单个"MVP"方法来处理整个应用程序.一个绝对需要应用程序导航的历史记录,像GXT-MVC这样的事件总线来连接/分离屏幕,以及MVP,以便轻松测试小部件的数据访问.

因此,我提出了一种结合这三个要素的分层方法,因为我认为"一事件 - mvp系统"解决方案不会起作用.导航/屏幕附加/数据访问是三个独立的问题,我将在接下来的几个月内重构我的应用程序(转移到GXT),分别为每个问题使用所有三个事件框架(工作的最佳工具).所有这三个要素都不需要彼此了解.我知道我的解决方案仅适用于GXT项目.

在编写大型GWT应用程序时,我觉得我必须在客户端上重新发明类似Spring-MVC的东西,这真的很糟糕,因为它需要花费大量的时间和脑力来吐出像Spring MVC那样优雅的东西.GWT需要一个应用程序框架,远远超过编译器工作人员如此努力的那些微小的JS优化.


JP *_*son 7

这是最近关于构建GWT应用程序的 Google IO演示文稿.

请享用.

-J.P