我正在读取playframework正在删除旧版2.4.x版本中的全局状态。
有人可以解释当前全球状态在哪里以及删除全局状态有什么好处?
答案 0 :(得分:1)
什么是全球状态?
对象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
。现在,如果您想获得该实例,则需要调用play.api.Play.current
并传入应用程序。因此,您在逻辑上仅依赖于Web服务客户端的相当小的组件现在依赖于整个应用程序。
另一个重要因素和前一点的直接后果是测试。我们假设您要测试您的Web服务组件。理论上,您只需要模拟(或提供一些虚拟实现)Web服务客户端。但是,现在您的代码中的某个地方正在调用{{1}},您需要确保在调用该字段时设置该字段。确保这一点的最简单方法是启动播放应用程序。因此,您只是为了测试您的小组件而启动整个应用程序。