Vaadin:设计模式

Xor*_*rty 30 design-patterns vaadin

我目前正在研究三种Vaadin应用程序,我真的觉得我想念一些东西.我之前曾经使用过Spring MVC,在这种情况下,体系结构清晰且分离,您可以向控制器注入服务,而不会将控制器耦合到UI等等.

现在在Vaadin那是不同的故事.所以,如果那里有任何Vaadin专家,请允许我问你几个问题:

问题1:

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

问题2:

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

问题3:

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

在我的代码转向Spaghetti之前,我想尽可能多地了解Vaadin的优秀设计,因此任何建议,经验和最佳实践都将受到赞赏.

Dus*_*y J 15

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

读完之后,我的答案可能会更有意义

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

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

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

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


Ren*_*nov 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