我刚开始为客户一个新的GWT项目,我很感兴趣,听人们的各种GWT MVC架构的经验。 在最近的一个项目,我用两个GXT MVC ,以及自定义消息解决方案(基于Appcelerator的MQ )。 GXT MVC的工作确定,但它似乎像矫枉过正GWT,是很难做出与浏览器历史记录的工作。 我听说过了PureMVC和GWTiger ,但从来没有使用过。 我们的定制MQ解决方案工作得很好,但使它很难与JUnit测试组件。
另外,我听说,谷歌Wave(GWT应用程序)的使用模型 - 视图 - 演示模式写入。 一个示例应用程序MVP最近公布,但看代码,它似乎并没有那么直观。
如果你正在建设一个新的GWT应用程序,你会使用的体系结构? 什么是您所选择的利弊?
谢谢,
马特
值得一提的是,谷歌终于写出了一个教程使用MVP的架构设计。 它澄清很多来自谷歌I / O谈话上面列出的元素。 一起来看看: https://developers.google.com/web-toolkit/articles/mvp-architecture
我很高兴这个问题已经被问,因为GWT desperatley需要构建的应用程序的轨道状的方式。 基于将为所有用例的90%的工作,使超级简单的可测性的最佳实践的简单方法。
在过去几年里我一直在用我自己的实现MVP的与奴役自己无论主持人告诉他做了非常被动的视图。
我的解决方案包括以下内容:
- 每插件限定的方法的接口来控制视觉外观
- 实现类,可以是一个复合或使用外部部件库
- 用于承载被由M小部件的N个视点的画面的中央演示
- 每个屏幕保持与当前视觉外观相关联的数据的中央模型
- 一般的监听类,如“SourcesAddEvents [CustomerDTO]”(编辑不喜欢这里Java泛型真正的符号,所以我用括号THOE),否则你将有很多相同的接口的谁只是由不同类型
该意见得到主持人作为其构造函数参数的引用,这样他们就可以与演示初始化它们的活动。 主讲人的意志处理这些事件,并通知其他部件/意见和或致电GWT-RPC上成功使得它的结果到模型中。 该模型具有典型的“房产[列表[字符串]名称= ...”,使由GWT-RPC请求模型的更新推移到所有的意见/小工具,与主持人注册的属性更改侦听机制感兴趣。
有了这个appraoch我已经得到了非常容易的可测性与EasyMock的我AsynInterfaces。 我也有方便地交换视图/小部件的执行情况的能力,因为所有我不得不重写的是,通知一些事件的演示代码 - 不管底层小部件(按钮,链接等)。
我的方法的问题:
- 我目前的执行使得它很难对不同屏幕的中心模型之间的数据同步值。 假设你有一个显示一组类别的屏幕和另一个屏幕,让你添加/编辑这些项目。 目前,它是非常困难的传播跨越画面的边界,这些变化的事件,因为该值在这些模型缓存,这是很难找到我们的一些事情是否是脏的(在传统的web1.0的-HTML本来是很容易-dumb终端那种情景与服务器端的声明缓存)。
- 意见的构造函数的参数使得超级简单的测试,但没有一个坚实的依赖注入框架,一个将里面一些丑陋的工厂/设置代码“onModuleLoad()”。 在我开始的时候,我不知道谷歌GIN的,所以,当我修改我的应用程序,我将用它来摆脱这种样板。 这里有一个有趣的例子是GIN-行李箱内的“HigherLower”的游戏。
- 我没有得到正确的历史第一次,所以很难从我的应用程序到另一个的一部分进行导航。 我的做法是不知道的历史,这是一个严重的衰退。
我的解决问题的思路:
- 使用GIN删除设置样板,是很难维持
- 虽然从GWT-Ext的移动GXT,使用它的MVC框架作为EventBus到安装/拆卸的模块化屏幕,以避免缓存/同步问题
- 想到某种“地方” -Abstraction像雷瑞安在他的谈话,在I / O 09,其中桥梁GXT-MVC和GWTs-Hitory方法之间的事件峡描述
- 使用MVP的小部件隔离数据访问
摘要:
我不认为可以使用一个单一的“MVP”的方式为整个应用程序。 一个definetly需要历史的应用程序的导航,像GXT-MVC一个eventbus附加/分离屏幕和MVP启用的widget的数据访问简单的测试。
因此,我建议,结合这三个要素分层的方法,因为我相信“一个事件-MVP系统” - 溶液不会工作。 导航/屏幕,安装/数据访问是三个独立的顾虑,我会修改我的应用程序(移动到GXT)在随后的几个月里,利用单独为每个关注这三个事件的框架(这项工作最好的工具)。 所有这三个元素不需要知道对方的。 我知道,我的解决方案仅适用于GXT-项目。
当写大GWT应用,我觉得我有机会再创造的客户端,这真的很烂的东西如Spring-MVC,因为它需要大量的时间和脑力吐出来的东西作为优雅的Spring MVC。 GWT需要比那些小小的JS-优化的编译器的家伙这么辛苦上更加的应用程序框架。
如果您有兴趣使用的MVP架构,你可能想看看GWTP: http://code.google.com/p/gwt-platform/ 。 这是一个开源的MVP框架我的工作,支持GWT的许多不错的功能,包括代码分裂和历史管理,用一个简单的基于注解的API。 这是相当近期的,但已经在一些项目中使用。
你应该看看GWT的Portlet 。 我们开发的GWT的Portlet框架上的大型人力资源门户网站应用程序的工作,而现在它是免费的,开源的。 从GWT的Portlet网站(托管在谷歌代码):
编程模型在某种程度上类似于写JSR168的portlet的门户服务器(Liferay的,JBoss的门户网站等)。 “入口”是使用GWT的Portlet框架作为库构建应用程序。 应用程序的功能被开发为每一个可选的服务器侧的DataProvider松散耦合门户组件。
每个portlet知道如何外部化的状态转变为可序列化PortletFactory子(时代报/ DTO /工厂模式),使得重要的功能成为可能:
- CRUD操作由单一GWT RPC对所有的Portlet处理
- 门户组件“页”上的布局可以表示为(由PortletFactory实现的接口)WidgetFactory的树
- WidgetFactory的树木可以被串行化和XML编组到/服务器上,保存在XML页面文件的GUI布局(或“页”)
该框架的其他重要功能列举如下:
- 页面可以在运行时浏览器进行编辑(由开发者和/或用户)使用框架布局编辑器
- Portlet的定位绝对因此可以使用滚动区域
- portlet是可配置的,表明当它们是用于自动“加载微调”显示忙装载和可被最大化
- 主题部件包括一个样式对话框,一个CSS样式的按钮替换,小按钮的位置和HTML模板驱动的菜单
GWT的Portlet是用Java代码实现的,没有包裹任何外部JavaScript库。 它不会强加任何服务器端框架(如Spring或J2EE),但其目的是在这样的框架一起很好地工作。
文章来源: What's your recommendation for architecting GWT applications? MVC, MVP or custom messaging solution?