Подтвердить что ты не робот

Ваадин: образцы дизайна

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

Теперь в Ваадине разная история. Поэтому, если есть специалисты Vaadin, позвольте мне задать вам несколько вопросов:

Вопрос 1:

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

Вопрос 2:

  • Ссылка на основное приложение передается ОГРОМУ количеству компонентов пользовательского интерфейса, потому что множество компонентов пользовательского интерфейса должны получить доступ к некоторым глобальным данным или вызвать глобальные методы в главном классе приложения.
  • Пример. У компонента Popup есть кнопка, которая открывает новое окно, которое должно быть дочерним по отношению к главному окну приложения. Поэтому компонент popup должен иметь ссылку на основное приложение.

Вопрос 3:

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Недавно я сделал презентацию в MVC vs MVP vs MVVM. Код примера может помочь вам понять переход от MVC к MVVM. Это написано на JavaScript, но это достаточно просто, что я считаю, что кто-то может следовать за ним. Я приветствую любые отзывы, которые у вас могут быть.

Ответ 2

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

Ответ 1

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

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

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

Ответ 2

Передача основной ссылки на приложение не кажется хорошим решением. Вы заметили, что экземпляр приложения представляет сеанс, но вам будет намного лучше определить какой-то контракт 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