gpt4 book ai didi

scala - akka-spray-websocket 激活器中 AbstractSystem 特征的目的是什么?

转载 作者:行者123 更新时间:2023-12-01 10:27:56 26 4
gpt4 key购买 nike

我正在学习 Spray 和 Akka。我正在通过 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 trait 的目的是什么?它是如何使用的,为什么使用它?

这个特征也被传递给实际的 Actor :

class FindService(find : ActorRef)(implicit system : ActorSystem) extends Directives {
lazy val route = ...
}

另外,如果不是完全不方便的话,logRequest()showReq()的作用是什么?

对于 Spray:为什么我必须将 actor (ActorRef) 传递到 FindServce 中?我没有看到从内部调用任何特定方法。

最佳答案

这是一个使用abstract def 来执行cake pattern 的非常简单的示例(虽然非常简化)。目标是说“嘿,我需要这个东西”,然后实现者必须通过实现 def 系统 向您提供参与者系统。目标当然是让这个 def 对 MainActors 可用。

关于self类型引用,可以引用ktoso/types-of-types#self-type-annotation了解更多信息。

关于scala - akka-spray-websocket 激活器中 AbstractSystem 特征的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23648348/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com