我正在学习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
?我没有看到从内部调用任何特定方法。
答案 0 :(得分:2)
这是使用abstract def
来执行cake pattern(非常简化)的一个非常简单的示例。目标是说"嘿,我需要这个东西",然后实现者必须通过实现def system
向你提供actor系统。目标当然是将此def提供给MainActors
。
至于自我类型参考,您可以参考ktoso/types-of-types#self-type-annotation了解更多信息。