Akka Http актер инъекция в черту - PullRequest
0 голосов
/ 16 октября 2018

У меня есть объект, расширяющий приложение, в котором я создаю систему акторов и материализатор акторов, а также создаю актера в рамках данной системы акторов.

object QuickstartServer extends App with UserRoutes {

  implicit val system: ActorSystem = ActorSystem("helloAkkaHttpServer")
  implicit val materializer: ActorMaterializer = ActorMaterializer()

  val userRegistryActor: ActorRef = system.actorOf(UserRegistryActor.props, "userRegistryActor")


   lazy val routes: Route = userRoutes
      Http().bindAndHandle(routes, "localhost", 8080)
    }

Теперь UserRoutes содержит все маршруты

trait UserRoutes extends JsonSupport {

  implicit def system: ActorSystem
  lazy val log = Logging(system, classOf[UserRoutes])
  def userRegistryActor: ActorRef

  lazy val userRoutes: Route =
    pathPrefix("users") {
      concat(
        pathEnd {
          concat(
            get {
              val users: Future[Users] =
                (userRegistryActor ? GetUsers).mapTo[Users]
//Remaining code 

Теперь мой вопрос заключается в том, как Actor System и userRegistryActor актер, созданный в QuickstartServer, вводятся в файл маршрутов?

Вы можете найти полный код здесь https://developer.lightbend.com/guides/akka-http-quickstart-scala/backend-actor.html

1 Ответ

0 голосов
/ 16 октября 2018

В начале признака вы можете видеть эти два объявления:

  implicit def system: ActorSystem
  def userRegistryActor: ActorRef

Эти два являются абстрактными объявлениями в признаке, что означает, что реализации признака должны предоставлять эти два.

Вот что происходит в объекте с этими двумя объявлениями:

 implicit val system: ActorSystem = ActorSystem("helloAkkaHttpServer")
 val userRegistryActor: ActorRef = system.actorOf(UserRegistryActor.props, "userRegistryActor")

Достойная доля разработчиков рекомендует сделать этот вид реализации более явным, добавив ключевое слово override, например:

 override implicit val system: ActorSystem = ActorSystem("helloAkkaHttpServer")
 override val userRegistryActor: ActorRef = system.actorOf(UserRegistryActor.props, "userRegistryActor")
...