我们正在使用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,如果这有任何区别。
答案 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应用程序相关的许多更难的问题,包括演示者和视图的懒惰实例化,历史管理,高效的代码分割等。