玩! 2.0斯卡拉 - 访问全局对象(Play! 2.0 Scala - Accessing g

2019-07-29 06:12发布

我已经声明它获取在应用程序启动实例化一个对象。 我想访问控制器,这是一个插件的一部分内。 我希望能够使用该插件,但我似乎无法让过去的第一部分-寻找MyWebsocketConnection对象。 的例子没有说明如何做到这一点。 我不想因为我正在写一个插件来注入到控制器(我看到如何做到这一点的地方静的例子)。

Global.scala ,插件应用程序\程序\ 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 ,插件应用\应用\控制器\ MyLogger.scala

object MyLogger {

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

}

所以,从玩游戏! 2.0应用程序,引用了插件,我就(可能)做一些像下面,但我甚至无法让过去在此之前的部分:

MyFutureController.scala ,另一出戏! 应用\应用\控制器\ MyFutureController.scala

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

Answer 1:

也有变通方法3:将您的全球级的封装,application.conf文件中指定其全名,就像这样:

全球= my.packaged.Global



Answer 2:

问题是,你的Global对象驻留在默认的包。 而在Java中,从默认的包中的类不能从其他的包引用,他们只能在同一包(缺省)访问。

我看到这个问题的两种解决方法。

  1. 移动MyWebsocketConnection某个命名的包(比如config ),因此它可以在你的应用程序访问。

     object MyLogger { def info(message: String) = { config.MyWebsocketConnection.logger.send(message) } } 
  2. 将你的整个应用到单个封装中(但它是一个很大的痛苦)

     foo |--controllers |--models |--views |--Global.scala 

    那么Global的对象将驻留在foo包,将应用程序中访问。



文章来源: Play! 2.0 Scala - Accessing global object