Какова цель черты AbstractSystem в активаторе akka-spray-websocket?

Я изучаю спрей и акка. И я изучаю это с помощью шаблонов 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? Я не вижу никаких конкретных методов, вызываемых изнутри.


person windweller    schedule 14.05.2014    source источник
comment
Я предполагаю, что это делается для того, чтобы сделать неявное значение ActorSystem доступным внутри типажа ReactiveApi без необходимости указывать точное значение в этот момент. В некотором роде это обходной путь для Scala, не поддерживающего неявные параметры в трейтах (например, по сравнению с классом FindService).   -  person jrudolph    schedule 14.05.2014
comment
@jrudolph Я согласен! Но как объяснить this: AbstractSystem => в классе MainActor?   -  person windweller    schedule 14.05.2014
comment
это явная типизированная ссылка на себя. Набрав это, вы гарантируете компилятору, что этот трейт всегда будет расширяться с помощью Abstract System. Он дает вам доступ к методам и полям из Abstract System внутри трейта Main Actors. В признаке ReactiveAPI вы видите, что мы обращаемся к полям find и hide. Мы можем это сделать, потому что ReactiveAPI ссылается на себя MainActors. В то же время ReactiveAPI расширяет AbstractSystem, как мы и заверили компилятор.   -  person goral    schedule 14.05.2014


Ответы (1)


Это очень простой пример использования abstract defs для выполнения выкройка торта (хотя и очень упрощенная). Цель состоит в том, чтобы сказать: «Эй, мне нужна эта штука», и затем разработчик должен предоставить вам систему акторов — путем реализации def system. Конечно, цель состоит в том, чтобы сделать это определение доступным для MainActors.

Что касается ссылки на собственный тип, вы можете обратиться к ktoso/types -of-types#self-type-annotation, чтобы узнать об этом больше.

person Konrad 'ktoso' Malawski    schedule 25.07.2014