2012-10-06 41 views
30

我目前的工作在三個Vaadin應用程序,我真的覺得我會錯過一些東西。我用前用Spring MVC的工作,而建築是明確的,去耦,你注入的服務控制器和不耦合控制器的用戶界面等。Vaadin:設計模式

現在Vaadin這是不同的故事。因此,如果有任何Vaadin專家在那裏,讓我問你幾個問題:

問題1:

  • 是否可以將注入服務(或DAO的)直接向UI組件?
  • 示例:負責在電子郵件應用程序中顯示聯繫人的組件(ContactWidget,基於帶鏈接的VerticalLayout)需要顯示聯繫人。將contactRepository直接注入到此UI元素可以嗎?

問題2:

  • 參考主應用程序被傳遞到UI其它的組件量巨大,因爲許多UI組件都需要訪問一些全局數據或調用在全球主要方法應用程序類
  • :彈出組件具有打開新窗口,這應該是在應用程序的主窗口的子按鈕。因此彈出組件必須對主應用程序有參考。

問題3:UI組件之間

  • 依賴關係會變得非常瘋狂。也許沒有什麼太多的在這裏做的,但有時感覺並不像這個窗口取決於該名單取決於彈出的......你的想法,它看起來緊密結合我

我會喜歡我的代碼變成麪條,所以任何建議,之前的經驗和最佳做法,將不勝感激學習儘可能多的有關良好的設計與Vaadin。

回答

15

我們已經使用MVVM模式(又名Fowler's PresentationModel)有很好的運氣。他的文檔有點舊,但是一個很好的起點。

你讀過之後,我的回答可能更有意義

  1. 號注入你的服務到您的視圖模型。 ViewModel將是一個Facade(並且可以封裝適配器,裝飾器,緩存和任何其他您需要的模式)

  2. 我在這裏沒有看到問題,但是我們確實有類似於您的情況描述。我們使用Guava的EventBus在解耦組件之間進行通信。這樣,如果您需要彈出一個新窗口,您可以: eventBus.post(new NewWindowRequest(theComponent)) 而您的主應用程序可以訂閱相同的事件,然後彈出窗口。

  3. MVVM和謹慎使用EventBus可以提供幫助。此外,Vaadin的BeanItem和ObjectProperty可用於傳播更改,因爲它們是Vaadin內置的觀察者/數據綁定模式的一部分。

我最近做了一個presentation on MVC vs MVP vs MVVM。示例代碼可以幫助您瞭解從MVC到MVVM的轉變。它是用JavaScript編寫的,但很簡單,我相信大多數人都可以關注它。我歡迎您提供任何反饋。

+0

感謝名單灰塵。我最終選擇了基於番石榴的eventBus的手工製作的MVP(非常輕巧)和事件傳播。我對這個決定感到非常滿意,儘管Vaadin沒有穩定的MVP框架(儘管有一些beta/alphas /實驗)令人驚訝。 – Xorty

+0

是的,儘管已經有很長一段時間了,但沒有足夠多的關注讓其他科技獲得工程師喜歡。大多數使用它的人正在尋找最簡單的解決方案,或者如果你像我們一樣,沒有足夠的時間記錄我們正在做的事情。 手工打造是一個非常好的選擇。這些概念是非常重要的部分,大多數MVC/MVP/MVVM框架僅僅是爲了確保你在線上着色。如果你有紀律,他們通常不是一個要求。 –

9

Vaadin是一款非常棒的軟件,你絕對不應該用Spaghetti代碼代替。無論如何,一切都取決於你。

回答1

不,事實並非如此。無論使用何種框架,緊耦合都很糟糕。你的例子(ContactWidget)描述了一個列表的自定義實現。它可以作爲一個表格提供或不提供附加信息。我將使用表格示例,因爲它更復雜,更靈活(您可以構建具有高級表格組件和正確數據綁定的整個應用程序)。

Vaadin根據衆所周知的MVC模式定義高級數據模型。有三個嵌套圖層:容器,項目,屬性(屬性查看器和編輯器也被定義)。 Vaadin書提出了很好的類比:電子表格應用。所以容器,項目和屬性將對應於表,行和單元格。易於想象 - 易於理解。最後,ItemContainer會揭示它的本質,你會明白這是任何良好靈活的Vaadin架構的關鍵契約。我建議通過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

+1

Thanx的答案,我檢查了bambi-mvvm - 看起來非常好,但它是相當不完整的,未經測試和測試版。我發現大多數MVVM/MVP Vaadin相關的東西都是一樣的:( – Xorty

+0

不客氣,Vaadin太年輕了,或者說比較年輕就會更好:)我個人更喜歡將Container,Container.Indexed,...自己實現爲得到分頁和一些其他功能。 –