2012-05-03 16 views
23

Uygulama başlangıcında başlatılan bir nesne bildirdim. Bir eklentinin parçası olan bir denetleyiciye erişmek istiyorum. Bu eklentiyi kullanabilmek istiyorum, ancak ilk parçayı geçemiyorum - MyWebsocketConnection nesnesini bulmak. Örneklerin hiçbiri bunun nasıl yapıldığını göstermiyor. Denetleyiciye enjekte etmek istemiyorum çünkü bir eklenti yazıyorum (bunun nasıl yapılacağına dair statik örnekler gördüm). Uygulamayı eklentisi Oynat! 2.0 Scala - Genel nesneye erişme

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..."); 
    } 

} 

Benim özel günlüğü eklentisi kontrolör: Uygulama \ app \ kontrolörleri \ MyLogger.scala

object MyLogger { 

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

} 

eklentisi

MyLogger.Scala, Yani, oyundan! Eklentiyi referans alan 2.0 uygulaması, (muhtemelen) aşağıdaki gibi bir şey yapardım, ama bundan önce parçayı geçemiyorum:

MyFutureController.scala, başka bir Play! Uygulama \ app \ kontrolörleri sorun Global nesneler varsayılan paketinde bulunan olmasıdır MyFutureController.scala

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

cevap

32

geçici çözüm 3. da vardır: aynen böyle bir paket için Küresel sınıf taşımak ve dosyasına koyarak dosyada onun tam adını belirtin:

küresel = my.packaged.Global

+0

Bu en iyi yanıttır. – vaughan

+2

Varsayılan: application.global = ... 'dir. Haklısın, global olmak zorunda değilsin. – samwize

3

\. Ve Java'da, varsayılan paket sınıfları diğer paketlerden referans alınamaz, yalnızca aynı paket içinde erişilebilirler (varsayılan).

Bu sorunun iki geçici çözümünü görüyorum. Bazı adlandırılmış pakete

  1. Taşı MyWebsocketConnection (config diyelim) bu yüzden uygulamanızda erişilebilir olabilir.

    object MyLogger { 
        def info(message: String) = { 
        config.MyWebsocketConnection.logger.send(message) 
        } 
    } 
    
  2. tek bir paket halinde tüm uygulamayı Taşı

    (ama çok fazla acı olan)

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

    Sonra Global nesne foo pakette bulunan ve uygulama içinde erişilebilecektir.

İlgili konular