2016-07-01 5 views
0

私はソケットメソッドを持つ私のプロジェクトにコントローラを持っています私はコンパニオンobject.Butでそのメソッドを呼び出したいと思いますが、私はパラメータを渡す必要がある私はすることはできませんオブジェクトをコンパニオンにも。 は、ここに私のコードサンプルです:スカラーコンパニオンオブジェクトからコントローラのメソッドを呼び出す

class WebSocketController @Inject() (cache:CacheApi)(implicit actorSystem:ActorSystem, materializer:Materializer) extends Controller { 

def socket = WebSocket.accept[JsValue , JsValue] { request => 
ActorFlow.actorRef(out => SocketHandlerClass.props(out,postActor)) 

} 


} 


/*My Companion Object */ 

object WebSocketController { 

/* how to call socket method here ???*/ 

} 
+1

コンパニオンオブジェクトは、静的なvals/vars/defのセットと見ることができます。ソケット関数は、WebSocketControllerのインスタンスで定義されます。つまり、WebSocketControllerのインスタンスを作成せずにこれを行うことはできません。 – irundaia

+0

したがって、これらの引数がすべて必要なWebSocktetControllerクラスのインスタンスを作成するにはどうすればよいですか。基本的には、ソケットメソッドを別のプロジェクトからjarファイルとして呼び出す必要があります。この場合、コンパニオンオブジェクトを使用してソケットメソッドを呼び出す方法がわかりません。 –

答えて

1

静的メソッドを呼び出すと、コードが密結合になり、このようなテストであざけるように依存性注入の他の利点を破るために、あなたは、それを行うべきではありません技術的には可能ではあるが。

あなたがそれを行う必要があります方法:あなたがコンパニオンオブジェクトで行う予定何でも は、他のいくつかのclassにして、そのクラスを注入することを行います。それでも、これは遊び2.5で廃止されており、プレイ2.6で削除されますが、あなたが本当に仲間内でそのクラスのインスタンスを取得したい場合は、そのコンパニオンオブジェクト ノートでそれを行うことができますどのように

むしろ不幸な設計上の選択のような外部のルックスから、コントローラのメソッドを呼び出して、この基本的に破って、依存性注入のほかただし

Play.current.injector.instanceOf[WebSocketController] 

:オブジェクトは、あなたがこれを行うことができます。コントローラにはロジックが含まれてはいけません。また、上記のように、ロジックを他のクラスに抽出してコントローラに注入する必要があります。

+0

ok.Butどちらの場合でも、私はソケット関数を呼び出す必要があります。どのように達成されるのでしょうか? –

+0

2番目の(推奨されない)ケースのみ。多分あなたはここで達成しようとしていることを説明する必要があります – rethab

+0

私は自分のコードをjarとして使い、他のプロジェクトのsocketのようなメソッドを使用しようとしています。私は 'インポート'を行った後でも直接メソッドを呼び出すことはできません。そのために間違っていない場合は、コンパニオンオブジェクトを使用する必要があります。ここでの問題は、私はソケット関数を呼び出したいということです。私はこれを行う方法を明確にしていません。 –

関連する問題