2016-07-01 2 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

동반 개체는 정적 val/vars/def 세트로 볼 수 있습니다. 소켓 함수는 WebSocketController 인스턴스에 정의됩니다. 즉, WebSocketController의 인스턴스를 만들지 않고는이 작업을 수행 할 수 없습니다. – irundaia

+0

그럼, 어떻게 필자는 이러한 모든 인수가 필요한 WebSocktetController 클래스의 인스턴스를 만들 수 있을까요? 기본적으로 난이 병 항아리로 다른 프로젝트에서 소켓 메서드를 호출하고 싶습니다. 그리고이 경우에는 동반자 개체를 사용하여 수행하는 방법을 명확하지 않습니다. –

답변

1

정적 메소드를 호출하는 코드가 밀접하게 결합하게하고 같은 테스트에서 조롱과 같은 의존성 주입의 다른 혜택을 패배 때문에, 당신은 그 일을해서는 안 기술적으로 가능하지만.

당신이 그것을 할 방법 : 당신이 동반자 개체에 할 계획 무엇이든 이, 다른 class과 그 클래스를 주입 그렇게. 당신은 여전히이 플레이 2.5 이상 사용되지 않으며 플레이 2.6 제거됩니다 주 객체 동반자와 함께 할, 그러나 수있는 방법

당신은 정말 동반자 내부 클래스의 인스턴스를 얻으려면 객체, 당신은이 작업을 수행 할 수 있습니다

Play.current.injector.instanceOf[WebSocketController] 

그러나이 본질적으로 물리 치고 의존성 주입 외에, 외부에서 컨트롤러의 메소드를 호출하는 것은 오히려 불행한 디자인 선택처럼 보인다

. 컨트롤러는 어떤 로직도 포함해서는 안됩니다. 위에서 말했듯이, 여러분은 다른 클래스에 로직을 추출하여 컨트롤러에 주입해야합니다.

+0

ok.But 두 경우 모두에서, 나는 소켓 함수를 호출해야 할 것입니다. 어떻게 달성 될지 나는 분명하지 않다? –

+0

두 번째 (권장하지 않음) 경우에만. 어쩌면 당신이 여기서 달성하려고하는 것을 설명해야합니다 – rethab

+0

나는 병으로 내 코드를 사용하고 다른 프로젝트에서 소켓과 같은 방법을 사용하려고합니다. 하지만 '가져 오기'를 수행 한 후에도 직접 메서드를 호출 할 수는 없습니다. 왜냐하면 잘못된 것이 아니라면 동반자 객체를 사용해야 할 것입니다. 문제는 여기에 소켓 함수를 호출하고 싶습니다. 나는 이것을 어떻게하는지 명확하지 않다. –

관련 문제