如何在GWT MVP架构中处理服务和事件总线实例?

时间:2010-06-27 20:00:15

标签: java design-patterns gwt

我们正在使用MVP模式开发一个应用程序,如本指南中所述:

http://code.google.com/webtoolkit/articles/mvp-architecture.html

创建控制器实例时,我们执行以下操作:

appController = new AppController(service, eventBus);
appController.go(RootPanel.get("SOME_SLOT"));

现在,当控制器创建某个演示者时,它会执行以下操作:

sthPresenter = new SthPresenter(service, eventBus, new SthView());
sthPresenter.go();

演示者将eventBus和服务保存到私有字段变量,并根据需要使用。

随着应用程序的增长,我们有越来越多的演示者和视图,所以问题是我们可以使用不同的方法在演示者中获取服务和eventBus,而不通过每个演示者的构造函数传递引用。

例如,在控制器中创建静态字段,并使用AppController.getService()之类的东西调用它。也许是单身人士模式。

控制器(或其他地方)中的静态字段对于此设计是不是一个坏主意。请记住,代码编译为javascript,如果这有任何区别。

3 个答案:

答案 0 :(得分:1)

我强烈建议dependency injection(DI)。它允许您避免样板代码(单例等),全局状态,并且通常会导致更可测试的代码。 Misko Hevery有一些非常有趣的帖子,包括内容丰富的guide to writing testable code

对于GWT中的DI,你应该使用Gin - 一个流行的Guice DI framework的包装器。我一直在使用它来进行一个相当复杂的项目,只是使用DI / Gin(并考虑如何最有效地应用它)肯定会导致更“干净”,可测试的代码。

答案 1 :(得分:0)

使用单例和观察者模式。确保您只为通知使用高级别事件,否则您最终会遇到噩梦。

编译为JavaScript的代码对您来说非常透明。

答案 2 :(得分:0)

这是GWT MVP应用程序中经常遇到的情况。在我的应用程序中,我使用依赖注入(使用GIN)将事件总线注入演示者。演示者本身就是单身人士,如果需要,可以热切地实例化。但是,这样做会大大降低应用程序的可伸缩性,因为大型应用程序一旦启动就会要求您实例化多个演示者。

正确地解决这个问题可能有点牵扯。我建议你看一下GWT-platform framework,它处理与GWT MVP应用程序相关的许多更难的问题,包括演示者和视图的懒惰实例化,历史管理,高效的代码分割等。