30

我目前正在开发三个 Vaadin 应用程序,我真的觉得我错过了一些东西。我以前使用过 Spring MVC,架构清晰且解耦,您将服务注入控制器,而不是将控制器耦合到 UI 等等。

现在在 Vaadin,情况就不同了。所以如果有任何 Vaadin 专家,让我问你几个问题:

问题一:

  • 是否可以直接向 UI 组件注入服务(或 DAO)?
  • 示例:在电子邮件应用程序中负责显示联系人的组件(ContactWidget,基于带有链接的 VerticalLayout)需要显示联系人。可以直接将contactRepository 注入这个UI 元素吗?

问题2:

  • 对主应用程序的引用被传递给大量的 UI 组件,因为许多 UI 组件需要访问一些全局数据或调用主应用程序类上的全局方法
  • 示例:弹出组件具有打开新窗口的按钮,它应该是应用程序中主窗口的子窗口。因此弹出组件必须引用主应用程序。

问题 3:

  • UI 组件之间的依赖关系可能会变得非常疯狂。在这里可能没什么可做的,但有时感觉这个窗口并不依赖于这个依赖于弹出窗口的列表......你明白了,它看起来与我紧密相连

在我的代码转向Spaghetti之前,我想尽可能多地了解 Vaadin 的优秀设计,因此任何建议、经验和最佳实践将不胜感激。

4

2 回答 2

15

使用 MVVM 模式(又名Fowler 的 PresentationModel )我们非常幸运。他的文档有点旧,但是一个很好的起点。

看完之后,我的回答可能更有意义

  1. 不,将您的服务注入您的 ViewModel。ViewModel 将是一个外观(并且可以封装适配器、装饰器、缓存和您决定需要的任何其他模式)

  2. 我在这里没有看到问题,但是我们确实遇到了与您所描述的情况相似的情况。我们使用 Guava 的 EventBus 在解耦的组件之间进行通信。这样,如果你需要弹出一个新窗口,你可以: eventBus.post(new NewWindowRequest(theComponent)) 和你的主应用程序订阅同一个事件,然后弹出窗口。

  3. MVVM 和谨慎使用 EventBus 会有所帮助。此外,Vaadin 的 BeanItem 和 ObjectProperty 可用于传播更改,因为它们是 Vaadin 内置观察者/数据绑定模式的一部分。

我最近做了一个关于 MVC vs MVP vs MVVM 的演讲。示例代码可以帮助您理解从 MVC 到 MVVM 的转变。它是用 JavaScript 编写的,但它非常简单,我相信大多数人都可以遵循它。我欢迎您提出任何反馈意见。

于 2012-10-07T18:28:21.820 回答
9

Vaadin 是一款很棒的软件,您绝对不应该使用 Spaghetti 代码。无论如何,一切都取决于你。

答案 1

不,不是。无论使用何种框架,紧耦合都是不好的。您的示例(ContactWidget)描述了列表的自定义实现。它可以呈现为带有或不带有附加信息的表格。我将使用表格示例,因为它更复杂且更灵活(您可以构建具有高级表格组件和适当数据绑定的整个应用程序)。

Vaadin 定义了遵循著名的 MVC 模式的高级数据模型。共有三个嵌套层:容器、项目、属性(还定义了属性查看器和编辑器)。Vaadin 的书提出了很好的类比:电子表格应用程序。所以容器、项目和属性将对应表、行和单元格。容易想象——容易理解。最后,ItemContainer 将揭示它的本质,您将理解这是任何良好且灵活的基于 Vaadin 架构的关键契约。我建议查看 Vaadin 的书,以获取所有其他详细信息:

您还可以查看任何 PagedTable 插件背后的容器实现,以获得更好的理解。也请从 ArrayContainer https://vaadin.com/directory#addon/array-container开始,它将为您简化很多。

答案 2

传递主应用程序引用似乎不是一个好的解决方案。您确实注意到 Application 实例代表会话,但您最好定义某种 SessionContext 契约(它仍然可以由您的应用程序实现)。可以定义一个静态方法来提供对相关 SessionContext 实例的透明访问。在引擎盖下,它可以使用 ThreadLocal 变量http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html这样您将摆脱所有传递的寄生参数。

答案 3

精心设计您的层次结构。不要自己触发重绘,而是使用Refresher。密切关注整个架构。

最后,Vaadin 易于使用,因此在更改主代码库之前可以随意做一些小型 PoC 和演示。

正如建议的那样,您也可以尝试 MVVM https://vaadin.com/directory#addon/bambi-mvvm

于 2012-10-07T21:01:28.940 回答