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

时间:2016-02-01 00:03:49

标签: scala playframework

我正在读取playframework正在删除旧版2.4.x版本中的全局状态。

有人可以解释当前全球状态在哪里以及删除全局状态有什么好处?

1 个答案:

答案 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服务的组件。这类的依赖是什么? WSClientplay.api.libs.ws.WS.client。现在,如果您想获得该实例,则需要调用play.api.Play.current并传入应用程序。因此,您在逻辑上仅依赖于Web服务客户端的相当小的组件现在依赖于整个应用程序。

另一个重要因素和前一点的直接后果是测试。我们假设您要测试您的Web服务组件。理论上,您只需要模拟(或提供一些虚拟实现)Web服务客户端。但是,现在您的代码中的某个地方正在调用{{1}},您需要确保在调用该字段时设置该字段。确保这一点的最简单方法是启动播放应用程序。因此,您只是为了测试您的小组件而启动整个应用程序。