2015-07-21 32 views
7

我想解決如何在Play Framework 2.4中使用依賴注入。我熟悉一般原則,但並不真正瞭解對設計的影響。我的一般推理是,控制器類中的靜態方法與使用全局變量類似,並且很容易導致線程安全等問題,而且總體上鼓勵糟糕的設計。因此,由於Play現在鼓勵切換到依賴注入,所以我應該切換。玩框架java依賴項注入 - 何時使用singletons

我感到困惑的是在這種情況下什麼是好的做法。當我閱讀Play官方文檔時,會簡要介紹依賴注入,然後及時提及@Singleton註釋。並且可用示例(http://www.typesafe.com/activator/template/play-guice)也討論了單例「WelcomeTextGenerator」類。

所以我想知道,我應該使用單例對象作爲例子似乎暗示?如果是這種情況,與舊的靜態方法方法相比有什麼優勢?是否有特定的對象類型(例如,控制器?)應該是單例,並且在不將對象標記爲單例時會有性能影響?

回答

6

所以我想知道,我應該使用單例對象作爲例子似乎暗示?如果是這種情況,與舊的靜態方法方法相比有什麼優勢?

依賴注入是一種將應用程序連接在一起的技術。你寫的組件不直接相互依賴。相反,您可以將組件注入彼此。通過這種方式,您可以簡單地交換應用程序的整個部分,而無需觸摸一行代碼。在編寫單元測試時,依賴注入特別有用。

與靜態方法相比,你可以使用所有那些花哨的OOP東西。這個問題基本上是「什麼是靜態方法缺點?

是否有特定的對象類型(例如,控制器?),應該是單身,以及是否有性能問題不標記對象爲單身?

玩或更具體地說,Guice將創建一個新的對象,每當依賴項被默認注入。將它們標記爲@Singleton將只創建一個對象,並在所有注入中重複使用完全相同的對象。換句話說:Singletons保存一些對象創建和垃圾收集,但需要同步來初始化對象。

來到你的問題時使用@Singleton,因爲(source)經驗法則:

  • 狀態的對象,如配置或計數器
  • 對象是昂貴的建造或查找
  • 捆綁資源的對象,如數據庫連接池。

Guice順便提供了非常全面的documentation。我強烈建議瀏覽一段時間。

+1

謝謝 - 這就是我所需要的。我發現你鏈接到的「範圍」頁面非常有用。Play文檔中爲什麼「單身人士」被突出顯示或者還有其他選項對我來說並不明顯 - 這更有意義。 – myrosia

+0

經過多一點研究後,一個潛在的警告:「範圍」Guice頁面討論了請求範圍和會話範圍,但盡我所知,Play不支持這些,因爲它不使用Google的servlet容器實現,也不會目前提供自己的。所以在這個意義上,文檔頁面可能會產生誤導,因爲它沒有闡明實現依賴關係。 – myrosia