我正在阅读该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/

    10-16 02:41