在akka-spray-websocket激活剂中AbstractSystem特性的目的是什么?

时间:2014-05-14 07:35:48

标签: scala akka spray

我正在学习Spray和Akka。我正在通过TypeSafe的模板学习它,而且这个模板至少非常复杂:

http://typesafe.com/activator/template/akka-spray-websocket

我现在明白这个模板所具有的werid结构是将路由逻辑和业务逻辑分开并且令人惊讶地完成了。然而,虽然我知道这个结构的目的,但我不知道这个小块的功能是什么,为什么有必要:

他们有一个名为MainActors.scala的课程:

trait MainActors {
  this: AbstractSystem =>

  lazy val find = system.actorOf(Props[FindActor], "find")
  lazy val hide = system.actorOf(Props[HideActor], "hide")
}

然后,模板连接一个名为ReactiveApi.scala的类的所有路由:

trait AbstractSystem {
  implicit def system: ActorSystem
}

trait ReactiveApi extends RouteConcatenation with StaticRoute with AbstractSystem {
  this: MainActors =>

  val rootService = system.actorOf(Props(classOf[RootService], routes))

  lazy val routes = logRequest(showReq _) {
    new FindService(find).route ~
    new HideService(hide).route ~
    staticRoute
  }

  private def showReq(req : HttpRequest) = LogEntry(req.uri, InfoLevel)
}

实际上,我的问题很简单:AbstractSystem特质的目的是什么?它是如何使用的以及为何使用它?

这个特性也传递给实际的演员:

class FindService(find : ActorRef)(implicit system : ActorSystem) extends Directives {
  lazy val route = ...
}

此外,如果不是完全不方便,logRequest()showReq()的功能是什么?

对于Spray:为什么我必须将演员(ActorRef)传递给FindServce?我没有看到从内部调用任何特定方法。

1 个答案:

答案 0 :(得分:2)

这是使用abstract def来执行cake pattern(非常简化)的一个非常简单的示例。目标是说"嘿,我需要这个东西",然后实现者必须通过实现def system向你提供actor系统。目标当然是将此def提供给MainActors

至于自我类型参考,您可以参考ktoso/types-of-types#self-type-annotation了解更多信息。