[英]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.