2010-06-27 51 views
2

我們正在開發使用MVP模式的應用程序,如本指南中描述:如何處理GWT MVP體系結構中的服務和事件總線實例?

http://code.google.com/webtoolkit/articles/mvp-architecture.html

當創建我們做的控制器實例如下:

appController = new AppController(service, eventBus); 
appController.go(RootPanel.get("SOME_SLOT")); 

現在,當控制器創建某個主持人,它做這樣的事情:

sthPresenter = new SthPresenter(service, eventBus, new SthView()); 
sthPresenter.go(); 

演示者比保存事件總線和對私有字段變量的服務,並根據需要使用。

隨着應用程序的增長,我們有越來越多的演示者和視圖,所以問題是我們可以使用不同的方法在演示者中獲取服務和eventBus,而不必通過每個演示者的構造函數傳遞引用。

例如,在控制器中創建一個靜態字段,並使用類似AppController.getService()的方法調用它。也許是單身模式。

控制器(或其他地方)的靜態字段對於這種設計是一個壞主意。請記住,代碼編譯爲JavaScript,如果這有什麼區別。

回答

1

我強烈建議dependency injection(DI)。它允許你避免樣板代碼(單例等),全局狀態,並且通常導致更可測試的代碼。 Misko Hevery有一些非常有趣的帖子,包括非常豐富的guide to writing testable code

對於GWT中的DI,您應該使用Gin - 圍繞流行的Guice DI framework的封裝。我一直在使用它來完成一個相當複雜的項目,並且僅僅使用DI/Gin(並且思考如何最有效地應用它)肯定會導致更「乾淨」,可測試的代碼。

0

使用單例和觀察者模式。確保你只使用高級別的事件進行通知,否則你最終會陷入噩夢。

編譯爲JavaScript的代碼對您來說真的很透明。

0

這是在GWT MVP應用程序中經常遇到的情況。在我的應用程序中,我使用依賴注入(與GIN)將事件總線注入演示者。演示者本身是單身人士,如果需要可以急於實例化。但是,這樣做會大大降低應用程序的可伸縮性,因爲大型應用程序會要求您在啓動時儘快實例化許多演示者。

自己正確解決這個問題可能有點牽扯。我建議你看看GWT-platform framework,它處理許多與GWT MVP應用程序相關的更多難題,包括演示者和視圖的懶惰實例化,歷史管理,高效代碼分割等。