我正在阅读该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
调用内部上下文,该上下文使用当前正在运行的应用程序来获取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
,您需要确保在调用该字段时已设置该字段。而最简单的方法是启动 Play 应用程序。因此,您只是为了测试您的小组件而启动整个应用程序。关于scala - 游戏框架的全局范围在哪里,消失了有什么好处?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35121110/