Skip to main content
 首页 » 编程设计

design-patterns之Vaadin:设计模式

2024年10月01日45bluestorm

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

3年前关闭。




Improve this question




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

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

问题一:

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

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

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

  • 在我的代码变为 之前,我想尽可能多地了解 Vaadin 的优秀设计。意大利面 ,所以任何建议、经验和最佳实践将不胜感激。

    请您参考如下方法:

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

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

  • 不,将您的服务注入(inject)您的 ViewModel。 ViewModel 将是一个外观(并且可以封装适配器、装饰器、缓存和您决定需要的任何其他模式)
  • 我在这里没有看到问题,但是我们确实遇到了与您所描述的情况相似的情况。我们使用 Guava 的 EventBus 在解耦的组件之间进行通信。这样,如果需要弹出新窗口,可以:eventBus.post(new NewWindowRequest(theComponent))和你的主应用程序可以订阅相同的事件,然后弹出窗口。
  • MVVM 和谨慎使用 EventBus 会有所帮助。此外,Vaadin 的 BeanItem 和 ObjectProperty 可用于传播更改,因为它们是 Vaadin 内置观察者/数据绑定(bind)模式的一部分。

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