玩2.0 Scala-访问全局对象

玩2.0 Scala-访问全局对象,scala,global,sbt,playframework-2.0,Scala,Global,Sbt,Playframework 2.0,我声明了一个在应用程序启动时实例化的对象。我想在控制器中访问它,它是插件的一部分。我希望能够使用该插件,但我似乎无法通过第一部分——查找MyWebsocketConnection对象。这些例子都没有说明如何做到这一点。我不想注入控制器,因为我正在编写一个插件(我在某处看到了如何实现这一点的静态示例) Global.scala,插件应用程序\app\Global.scala object Global extends GlobalSettings { object MyWebsocketCo

我声明了一个在应用程序启动时实例化的对象。我想在控制器中访问它,它是插件的一部分。我希望能够使用该插件,但我似乎无法通过第一部分——查找
MyWebsocketConnection
对象。这些例子都没有说明如何做到这一点。我不想注入控制器,因为我正在编写一个插件(我在某处看到了如何实现这一点的静态示例)

Global.scala
,插件应用程序\app\Global.scala

object Global extends GlobalSettings {

  object MyWebsocketConnection {
    val logger = // return something that gets instantiated once, like websocket object for logging to ui
  }

  class MyWebsocketConnection {
    import MyWebsocketConnection.logger
  }

  override def onStart(app: Application) {
    Logger.info("Application has started...");
  }

}
我的自定义日志插件控制器:

MyLogger.Scala
,插件应用程序\app\controllers\MyLogger.Scala

object MyLogger {

  def info(message: String) = {
    // THIS CAN'T BE FOUND ?
    // MyWebsocketConnection.logger.send(message)
  }

}
所以,从这出戏开始!引用插件的2.0应用程序,我(可能)会执行以下操作,但在此之前我甚至无法通过该部分:

MyFutureController.scala
,又一出戏!application\app\Controller\MyFutureController.scala

object MyFutureController extends Controller {
  def someRandomMethod = Action {
    // Custom logging
    MyLogger.info("Here's my log message!");
    Ok("This documentation stinks!")
  }
}

问题是您的
全局
对象驻留在默认包中。在Java中,默认包中的类不能从其他包中引用,它们只能在同一个包中访问(默认)

我认为这个问题有两种解决办法

  • MyWebsocketConnection
    移动到某个命名包(比如
    config
    )中,以便在应用程序中访问它

    object MyLogger {
      def info(message: String) = {
      config.MyWebsocketConnection.logger.send(message)
      }
    }
    
  • 将整个应用程序移动到单个软件包中(但这会带来很多麻烦)

    然后
    Global
    对象将驻留在
    foo
    包中,并可在应用程序中访问

  • object MyLogger {
      def info(message: String) = {
      config.MyWebsocketConnection.logger.send(message)
      }
    }
    
    还有一个解决方法#3:将全局类移动到包中,并在application.conf文件中指定其完全限定名,如下所示:

    全局=my.packaged.global


    默认值是
    application.global=…
    。您是对的,它应该是
    global=…
    而不使用
    应用程序。