2012-05-03 24 views
23

He declarado un objeto que se crea una instancia en el inicio de la aplicación. Quiero acceder a él dentro de un controlador, que es parte de un complemento. Quiero poder usar ese complemento, pero parece que no puedo pasar de la primera parte, encontrar el objeto MyWebsocketConnection. Ninguno de los ejemplos muestra cómo hacer esto. No quiero inyectar en el controlador porque estoy escribiendo un complemento (vi ejemplos estáticos de cómo hacerlo en algún lugar).¡Juego! 2.0 Scala - Acceso al objeto global

Global.scala, plugin de aplicación \ 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..."); 
    } 

} 

Mi costumbre controlador de registro plugin:

MyLogger.Scala, plugin de controladores de aplicación \ app \ \ MyLogger.scala

object MyLogger { 

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

} 

Por lo tanto, desde el juego! 2.0 aplicación que hace referencia al complemento, probablemente haría algo como lo siguiente, pero ni siquiera puedo pasar la parte anterior:

MyFutureController.scala, otra Play! App \ controladores de programa \ \ MyFutureController.scala

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

Respuesta

32

También hay solución # 3: mover su clase mundial a un paquete y especificar su nombre completo en application.conf archivo, así:

mundial = my.packaged.Global

+0

Esta es la mejor respuesta. – vaughan

+2

El valor predeterminado es 'application.global = ...'. Tienes razón, debería ser 'global = ...' sin la 'aplicación'. – samwize

3

El problema es que sus objetos Global reside en paquete por defecto. Y en Java, las clases del paquete predeterminado no pueden referenciarse desde otros paquetes, solo se puede acceder al mismo paquete (predeterminado).

Veo dos soluciones de este problema.

  1. Mover MyWebsocketConnection a algún paquete con nombre (por ejemplo config) para que pueda ser accesible en su aplicación.

    object MyLogger { 
        def info(message: String) = { 
        config.MyWebsocketConnection.logger.send(message) 
        } 
    } 
    
  2. mover todo su aplicación en un solo paquete (pero es mucho dolor)

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

    Entonces Global objeto se reside en foo paquete y serán accesibles dentro de la aplicación.