2016-07-01 13 views
0

Ich habe eine Steuerung in meinem Projekt, die eine Socket-Methode Ich möchte diese Methode in Companion-Objekt aufrufen. Aber irgendwie kann ich das nicht tun, wie ich Parameter übergeben muss auch zum begleitenden Objekt, was ich nicht kann. Hier ist mein Codebeispiel:Aufruf Methoden von Controller von Scala Begleiter Objekte

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

Das Companion-Objekt kann als eine Gruppe statischer Vals/Vars/Defs angesehen werden. Die Socket-Funktion ist für eine Instanz des WebSocketControllers definiert. Mit anderen Worten, es ist nicht möglich, eine Instanz von WebSocketController zu erstellen. – irundaia

+0

Also, wie würde ich die Instanz der WebSocktetController-Klasse mit all diesen erforderlichen Argumenten erstellen. Grundsätzlich möchte ich die Socket-Methode von einem anderen Projekt aufrufen, indem Sie dies als ein Glas machen. Und mir ist nicht klar, wie es mit Begleitobjekten in diesem Fall zu tun ist. –

Antwort

1

Während technisch möglich, sollten Sie das nicht tun, weil statisch Methoden macht den Code fest gekoppelt und besiegt andere Vorteile der Dependency Injection wie spöttische in Tests aufrufen.

Wie Sie es tun sollten: Was auch immer Sie planen, in der Begleiter Objekt zu tun, tun, dass in einem anderen class und dann diese Klasse injizieren.

Wie Sie es immer noch Objekt mit dem Begleiter tun könnten Beachten Sie, dass diese 2.5 mit Spiel ist veraltet und wird mit Spiel 2.6 entfernt werden, aber wenn Sie wirklich wollen, eine Instanz dieser Klasse in dem Begleiter bekommen Objekt, können Sie dies tun:

Play.current.injector.instanceOf[WebSocketController] 

jedoch neben dieser im wesentlichen Dependency Injection zu besiegen, von einer Steuerung der Aufruf der Methode außerhalb sieht aus wie eine ziemlich unglückliche Design-Wahl. Controller sollten keine Logik enthalten - und wie oben erwähnt - sollten Sie Ihre Logik in eine andere Klasse extrahieren und diese in den Controller injizieren.

+0

ok. Aber auch in beiden Fällen werde ich die Socket-Funktion aufrufen müssen. Wie wird es erreicht, ich bin nicht klar? –

+0

Nur im zweiten (nicht empfohlenen) Fall. Vielleicht sollten Sie erklären, was Sie hier erreichen wollen – rethab

+0

Ich versuche, meinen Code als ein Glas zu verwenden und Methoden wie Socket in anderen Projekten zu verwenden. aber ich kann die Methoden nicht direkt aufrufen, auch nicht nach dem Import. Wenn ich nicht falsch liege, muss ich Begleitobjekte verwenden. Das Problem hier ist, dass ich die Socket-Funktion aufrufen möchte. und ich bin nicht klar (sage es noch einmal), wie man das macht. –