从scala伴随对象调用Controller的方法

时间:2016-07-01 09:31:44

标签: scala playframework akka companion-object

我的项目中有一个控制器,它有一个套接字方法我想在同伴对象中调用该方法。但不知怎的,我无法做到这一点,因为我需要将参数传递给同伴对象,我不能。 这是我的代码示例:

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 个答案:

答案 0 :(得分:1)

虽然技术上可行,但您不应该这样做,因为静态调用方法会使您的代码紧密耦合并且会破坏依赖注入的其他好处,例如在测试中进行模拟。

你应该怎么做: 无论你打算在伴侣对象中做什么,都可以在其他class中进行,然后注入该类。

如何使用随播广告对象 请注意,这在play 2.5中已弃用,将在play 2.6 中删除,但如果您真的想在随播对象中获取该类的实例,则可以执行以下操作:

Play.current.injector.instanceOf[WebSocketController]

然而,除了基本上打败依赖注入之外,从外部调用控制器的方法看起来像是一个相当不幸的设计选择。控制器不应包含任何逻辑 - 如上所述 - 您应该将逻辑提取到另一个类中,并将其注入控制器。