2012-05-03 3 views
23

私は、アプリケーションの開始時にインスタンス化されるオブジェクトを宣言しました。私はプラグインの一部であるコントローラの中でそれにアクセスしたい。私はそのプラグインを使用できるようにしたいが、最初の部分を過ぎているとは思わない - MyWebsocketConnectionオブジェクトを見つける。これを行う方法の例はありません。私はプラグインを書いているので、私はコントローラに注入したくない(私はどこかでそれを行う方法の静的な例を見た)。アプリケーションのプラグイン 再生! 2.0 Scala - グローバルオブジェクトへのアクセス

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

object MyLogger { 

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

} 

プラグイン

MyLogger.Scala、だから、プレイから!プラグインを参照している2.0アプリでは、私は(おそらく)以下のようなことをしますが、前にこの部分を過ぎて行くことはできません:

MyFutureController.scala、別のプレイ!アプリケーションの\アプリケーション\コントローラは、問題があなたのGlobalオブジェクトがデフォルトのパッケージに存在することであるMyFutureController.scala

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

答えて

32

回避策#3もあります。そうのように、パッケージにあなたのグローバルクラスを移動し、application.confファイルに完全修飾名を指定します。

グローバル= my.packaged.Global

+0

これは最良の答えです。 – vaughan

+2

デフォルトは 'application.global = ...'です。あなたは 'application 'なしで' global = ... 'にすべきです。 – samwize

3

\します。 Javaでは、デフォルトパッケージのクラスは他のパッケージから参照できません。同じパッケージ内でのみアクセス可能です(デフォルト)。

この問題の2つの回避策があります。

  1. いくつかの名前のパッケージに移動MyWebsocketConnectionconfigを言う)ので、それはあなたのアプリケーションにアクセスできるようにすることができます。

    object MyLogger { 
        def info(message: String) = { 
        config.MyWebsocketConnection.logger.send(message) 
        } 
    } 
    
  2. その後Globalオブジェクトがfooパッケージ内に存在し、アプリケーション内でアクセス可能になります(それは多くの痛みである)単一のパッケージに

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

    をアプリケーション全体を移動

関連する問題