我刚刚为客户启动了一个新的GWT项目,我很想听听人们对各种GWT MVC架构的体验。在最近的一个项目中,我使用了GXT MVC和自定义消息传递解决方案(基于Appcelerator's MQ)。 GXT MVC工作正常,但对GWT来说似乎有些过分,并且难以使用浏览器历史记录。我听说过PureMVC和GWTiger,但从未使用它们。我们的定制MQ解决方案工作得很好,但是使用JUnit测试组件很困难。
此外,我听说Google Wave(GWT应用程序)是使用Model-View-Presenter模式编写的。最近发布了sample MVP application,但查看代码时,它似乎并不直观。
如果您正在构建新的GWT应用程序,您将使用哪种架构?您选择的利弊是什么?
谢谢,
马特
答案 0 :(得分:17)
值得注意的是,谷歌终于写出了使用mvp架构进行设计的教程。它阐明了上面列出的google i / o talk中的许多元素。拿一个厕所:https://developers.google.com/web-toolkit/articles/mvp-architecture
答案 1 :(得分:11)
我很高兴有人提出这个问题,因为GWT desperatley需要一种类似于rails的方式来构建应用程序。基于最佳实践的简单方法,适用于所有用例的90%,并且具有超级易测试性。
在过去的几年里,我一直在使用我自己的MVP实现,并且有一种非常被动的观点,无论Presenter告诉他做什么,它都会被奴役。
我的解决方案包括以下内容:
视图获取对演示者的引用作为其构造函数参数,因此他们可以使用演示者初始化它们的事件。演示者将处理这些事件并通知其他窗口小部件/视图,或者调用gwt-rpc,成功时将其结果放入模型中。该模型具有典型的“Property [List [String]] names = ....”属性更改侦听器机制,该机制向演示者注册,以便gwt-rpc请求对模型的更新转发到所有视图/小部件有兴趣。
有了这个appraoch,我已经通过EasyMock为我的AsynInterfaces提供了非常简单的可测试性。我还能够轻松地交换视图/小部件的实现,因为我必须重写的是通知演示者某些事件的代码 - 无论底层小部件(按钮,链接等)。
我的方法存在问题:
我对这些问题的解决方案:
要点:
我不认为可以为整个应用程序使用单一的“MVP”方法。一个绝对需要应用程序导航的历史记录,像GXT-MVC这样的事件总线来连接/分离屏幕,以及MVP,以便轻松测试小部件的数据访问。
因此,我提出了一种结合这三个要素的分层方法,因为我认为“一事件 - mvp系统”解决方案不会起作用。导航/屏幕附加/数据访问是三个独立的问题,我将在接下来的几个月内重构我的应用程序(转移到GXT),分别为每个问题使用所有三个事件框架(工作的最佳工具)。所有这三个要素都不需要彼此了解。我知道我的解决方案仅适用于GXT项目。在编写大型GWT应用程序时,我觉得我必须在客户端上重新发明类似Spring-MVC的东西,这真的很糟糕,因为它需要花费大量的时间和脑力来吐出像Spring MVC那样优雅的东西。 GWT需要一个应用程序框架,远远超过编译器工作人员如此努力的那些微小的JS优化。
答案 2 :(得分:7)
答案 3 :(得分:3)
如果您对使用MVP架构感兴趣,可能需要查看GWTP:http://code.google.com/p/gwt-platform/。它是我正在开发的一个开源MVP框架,它支持GWT的许多不错的功能,包括代码分割和历史管理,以及一个简单的基于注释的API。这是最近的,但已经在许多项目中使用。
答案 4 :(得分:1)
你应该看看GWT Portlets。我们在开发大型HR Portal应用程序时开发了GWT Portlets框架,现在它是免费的开源软件。来自GWT Portlets网站(托管在Google代码上):
编程模型有点类似于为门户服务器(Liferay,JBoss Portal等)编写JSR168 portlet。 “门户”是使用GWT Portlets框架作为库构建的应用程序。应用程序功能是作为松散耦合的Portlet开发的,每个Portlet都有一个可选的服务器端DataProvider。
每个Portlet都知道如何将其状态外部化为可序列化的PortletFactory子类(momento / DTO /工厂模式),使重要的功能成为可能:
框架的其他重要功能如下:
GWT Portlets是用Java代码实现的,不包装任何外部Javascript库。它没有强加任何服务器端框架(例如Spring或J2EE),但设计为与这些框架结合使用。