【问题标题】:calling methods of Controller from scala companion objects从 scala 伴随对象调用 Controller 的方法
【发布时间】:2016-07-01 09:31:44
【问题描述】:

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

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 ???*/

}

【问题讨论】:

  • 伴生对象可以看作是一组静态 vals/vars/defs。套接字函数是在 WebSocketController 的一个实例上定义的。换句话说,如果不创建 WebSocketController 的实例,就不可能做到这一点。
  • 那么,我将如何使用所有这些参数创建 WebSocktetController 类的实例。基本上我想通过将其作为 jar 来调用另一个项目的套接字方法。在这种情况下,我不清楚如何使用伴随对象。

标签: scala playframework akka companion-object


【解决方案1】:

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

你应该怎么做: 无论您打算在伴生对象中做什么,都可以在其他一些 class 中执行此操作,然后注入该类。

您如何仍然可以使用伴随对象来做到这一点 请注意,这在 play 2.5 中已被弃用,并将在 play 2.6 中删除,但如果您真的想在伴生对象中获取该类的实例,您可以这样做:

Play.current.injector.instanceOf[WebSocketController]

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

【讨论】:

  • 好的。但即使在这两种情况下,我都必须调用套接字函数。我不清楚它是如何实现的?
  • 仅在第二种(不推荐)情况下。也许你应该在这里解释你想要实现的目标
  • 我正在尝试将我的代码用作 jar,并在其他项目中使用诸如 socket 之类的方法。但即使在“导入”之后我也不能直接调用这些方法。为此,如果我没有错,我将不得不使用伴随对象。这里的问题是我想调用套接字函数。我不清楚(再说一遍)如何做到这一点。
  • 为什么要调用这个函数?控制器由客户端通过 HTTP 调用。如果您的控制器包含逻辑,那么您做错了。如果您有任何想要与其他组件(或 jars,就此而言)共享的逻辑,请将该逻辑提取到其他类中。
  • 忘记控制器。如果这个具有相同主体的套接字函数在不同的类中。我想从其他地方调用相同的方法,该怎么做?
猜你喜欢
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多