繁体   English   中英

Akka Http演员注入特质

[英]Akka Http actor injection in trait

我有一个扩展App的对象,其中我创建了Actor系统和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系统和在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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM