簡體   English   中英

playframework的全球范圍在哪里以及它消失的好處是什么?

[英]Where was global scope in playframework and what are the benefits of it going away?

我正在讀取playframework正在刪除舊版2.4.x版本中的全局狀態。

有人可以解釋目前全球狀態在哪里以及消除全球狀態有什么好處?

什么是全球國家?

有一個對象play.api.Play與以下字段:

@volatile private[play] var _currentApp: Application = _

在哪里使用?

每當你做Play.current你都會引用那個單一的可變全局字段。 這在整個框架中用於訪問以下內容:

  • play.api.Play.configuration采用隱式應用程序
  • play.api.libs.concurrent.Execution.defaultContext調用內部上下文,它使用當前運行的app來獲取actor系統
  • play.api.libs.concurrent.Akka.system采用隱式應用程序
  • play.api.libs.ws.WS.url采用隱式應用程序
  • 還有更多的地方..

為什么那么糟糕?

許多函數只是采用一個隱式應用程序,所以這不是真正的全局狀態,對吧? 我的意思是,你可以通過那個應用程序。 但是你從哪里得到它? 通常,人們會導入play.api.Play.current

另一個例子:假設您要開發一個調用Web服務的組件。 這類的依賴是什么? WSClient 現在,如果你想獲得一個實例,你需要調用play.api.libs.ws.WS.client並傳入一個應用程序。 因此,您在邏輯上僅依賴於Web服務客戶端的漂亮小組件現在依賴於整個應用程序。

另一個重要因素和前一點的直接后果是測試。 假設您要測試Web服務組件。 從理論上講,您只需要模擬(或提供一些虛擬實現)Web服務客戶端。 但是現在你的代碼中的某個地方你正在調用play.api.Play.current ,你需要確保在調用它時設置該字段。 確保這一點的最簡單方法是啟動播放應用程序。 因此,您只是為了測試您的小組件而啟動整個應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM