2010-06-27 30 views
2

我们正在开发使用MVP模式的应用程序,如本指南中描述:如何处理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,而不必通过每个演示者的构造函数传递引用。

例如,在控制器中创建一个静态字段,并使用类似AppController.getService()的方法调用它。也许是单身模式。

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

回答

1

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

对于GWT中的DI,您应该使用Gin - 围绕流行的Guice DI framework的封装。我一直在使用它来完成一个相当复杂的项目,并且仅仅使用DI/Gin(并且思考如何最有效地应用它)肯定会导致更“干净”,可测试的代码。

0

使用单例和观察者模式。确保你只使用高级别的事件进行通知,否则你最终会陷入噩梦。

编译为JavaScript的代码对您来说真的很透明。

0

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

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