特性中的 Akka Http actor 注入

Akka Http actor injection in trait

我有一个扩展 App 的对象,我在其中创建了 Actor System 和 Actor Materializer,还在给定的 actor 系统下创建了一个 actor。

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 和在 QuickstartServer 中创建的 userRegistryActor actor 是如何注入到路由文件中的?

你可以在这里找到完整的代码https://developer.lightbend.com/guides/akka-http-quickstart-scala/backend-actor.html

在特征的开头,你可以看到那两个声明:

  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")