Я изучаю спрей и акка. И я изучаю это с помощью шаблонов TypeSafe, и этот очень сложный, по крайней мере:
http://typesafe.com/activator/template/akka-spray-websocket
Теперь я понимаю, что странная структура этого шаблона состоит в том, чтобы разделить логику маршрутизации и бизнес-логику, и это потрясающе сделано. Однако, хотя я знаю назначение этой структуры, я не знаю, какова функциональность этой маленькой штуки и зачем она нужна:
У них есть класс с именем 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()
?
Для спрея: почему я должен передать актера (ActorRef
) в FindServce
? Я не вижу никаких конкретных методов, вызываемых изнутри.
ActorSystem
доступным внутри типажаReactiveApi
без необходимости указывать точное значение в этот момент. В некотором роде это обходной путь для Scala, не поддерживающего неявные параметры в трейтах (например, по сравнению с классомFindService
). - person jrudolph   schedule 14.05.2014this: AbstractSystem =>
в классе MainActor? - person windweller   schedule 14.05.2014Abstract System
. Он дает вам доступ к методам и полям изAbstract System
внутри трейтаMain Actors
. В признакеReactiveAPI
вы видите, что мы обращаемся к полямfind
иhide
. Мы можем это сделать, потому чтоReactiveAPI
ссылается на себяMainActors
. В то же времяReactiveAPI
расширяетAbstractSystem
, как мы и заверили компилятор. - person goral   schedule 14.05.2014