【问题标题】:How to handle service and eventbus instances in GWT MVP Architecture?如何在 GWT MVP 架构中处理服务和事件总线实例?
【发布时间】:2010-06-28 14:48:29
【问题描述】:

我们正在使用 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 和服务保存到私有字段变量中,并根据需要使用其中任何一个。

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

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

控制器(或其他地方)中的静态字段对于此设计来说不是一个坏主意。请记住,代码会被编译为 javascript,如果这有什么不同的话。

【问题讨论】:

    标签: java design-patterns gwt


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      使用单例模式和观察者模式。确保只为通知使用高级事件,否则您将陷入噩梦。

      编译成 JavaScript 的代码对你来说真的是透明的。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2012-11-25
          • 1970-01-01
          • 1970-01-01
          • 2019-11-06
          • 1970-01-01
          • 2011-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多