Фреймворк Vaadin: шаблоны проектирования

в настоящее время я работаю над тремя приложениями Vaadin, и я действительно чувствую, что что-то пропустил. Раньше я работал с Spring MVC, где архитектура ясна и развязана, вы вводите службы контроллерам и не соединяете контроллер с UI и так далее.

теперь в фреймворк Vaadin это другая история. Так что если есть какие-то Vaadin специалисты там, позвольте мне задать вам несколько вопросов:

Вопрос 1:

  • оно в порядке впрыснуть услуг (или даос) напрямую с компонентами UI?
  • пример: компонент, ответственный за отображение контактов в приложении электронной почты (ContactWidget, основанный на VerticalLayout со ссылками), должен отображать контакты. Можно ли вводить contactRepository непосредственно в этот элемент пользовательского интерфейса?

Вопрос 2:

  • ссылка на основное приложение передается огромному количеству UI componenets, потому что многие компоненты пользовательского интерфейса должны получить доступ к некоторым глобальным данным или вызвать глобальные методы в основном классе приложения
  • пример: Popup компонент имеет кнопку, которая открывает новое окно, которое должно быть дочерним главного окна в приложении. Поэтому компонент popup должен иметь ссылку на основное приложение.

Вопрос 3:

  • зависимости между компонентами пользовательского интерфейса могут стать довольно дикими. Наверное, ничего особенного делать здесь, но иногда не кажется, что это окно зависит от этого списка, который зависит от этого всплывающего окна ... вы поняли идею, она выглядит тесно связанной со мной

Я хотел бы узнать как можно больше о хорошем дизайне с Vaadin, прежде чем мой код превратится в для спагетти, поэтому любые предложения, опыт и передовая практика будут оценены.

2 ответов


нам очень повезло с использованием шаблона MVVM (он же Фаулера PresentationModel). Его документы немного старые, но хорошая отправная точка.

после того, как вы прочитаете это, мои ответы могут иметь больше смысла

  1. нет. Внедрите свои услуги в ViewModel. ViewModel будет фасадом (и может инкапсулировать адаптеры, декораторы, кэши и любые другие шаблоны, которые вы решите, что вам нужно)

  2. Я не видел вопроса здесь, но у нас есть ситуация, похожая на то, что вы описываете. Мы используем EventBus Guava для связи между развязанными компонентами. Таким образом, если вам нужно открыть новое окно, вы можете: eventBus.post(new NewWindowRequest(theComponent)) И Ваше основное приложение может быть подписано на то же событие, а затем всплывающее окно.

  3. MVVM и осторожное использование EventBus может помочь. Кроме того, BeanItem и ObjectProperty Vaadin могут использоваться для распространения изменений, поскольку они являются частью встроенного Vaadin наблюдатель / шаблон привязки данных.

недавно я сделал презентация на MVC против МВП против в MVVM. Пример кода может помочь вам понять переход от MVC к MVVM. Он написан на JavaScript,но он достаточно прост, что я считаю, что большинство может следовать ему. Я приветствую любые отзывы, которые у вас могут быть.


Vaadin-отличная часть программного обеспечения, и вы определенно не должны заканчивать код спагетти. В любом случае, все зависит от вас.

ответ 1

нет, это не так. Плотное соединение плохо независимо от используемых рамок. В вашем примере (ContactWidget)описывается пользовательская реализация списка. Он может быть отображен в виде таблицы с дополнительной информацией или без нее. Я буду использовать пример таблицы, потому что он более сложный и более гибкий (вы можете создать целое приложение с расширенным компонентом таблицы и правильной привязкой данных).

Vaadin определяет расширенную модель данных, следуя хорошо известному шаблону MVC. Существует три вложенных слоя: контейнер, элемент, свойство (также определены средства просмотра свойств и редакторы). Книга фреймворк Vaadin напрашивается хорошая аналогия: применение электронных таблиц. Таким образом, контейнер, элемент и свойство будут соответствовать таблице, строке и ячейке. Легко представить, легко понять. Наконец, ItemContainer покажет, что это природа и вы поймете, что это ключевой контракт для любой хорошей и гибкой архитектуры на основе Vaadin. Я бы посоветовал полистать книгу, то Vaadin, чтобы получить все остальные детали:

вы также можете просмотреть реализацию контейнера за любым аддоном PagedTable, чтобы получить еще лучшее понимание. Пожалуйста, также начните с ArrayContainer https://vaadin.com/directory#addon/array-container, это упростит многое для вас.

ответ 2

передача ссылки на основное приложение не кажется хорошим решением. Вы заметили, что экземпляр приложения представляет сеанс, но вам будет намного лучше определить какой-то контракт SessionContext (который все еще может быть реализован вашим приложением). Можно определить статический метод чтобы обеспечить прозрачный доступ к соответствующему экземпляру SessionContext. Под капотом он может использовать переменную ThreadLocalhttp://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html таким образом вы избавитесь от всех паразитных параметров прохождения.

ответ 3

создать иерархию с большой осторожностью. Не запускайте перекраску самостоятельно, используйте повышение квалификации вместо. Следите за всем архитектура.

наконец, Vaadin прост в использовании, поэтому не стесняйтесь делать некоторые крошечные PoCs и демонстрации перед изменением основной кодовой базы.

Как было предложено, вы также можете попробовать MVVM https://vaadin.com/directory#addon/bambi-mvvm