Boot.scala在哪里适用?

Jac*_*ack 4 scala akka

我不时会看到有一个boot.scala或Boot.scala文件的项目.虽然这似乎不是一个硬的快速Scala规则,但它似乎是包含Boot.scala文件的民间传说.一些项目.这个特定项目使用Akka和Spray,它转换为actor模式和REST服务.

有人请说明在这样的文件中通常可以预期的功能类型,以及这是一种常见的排序模式吗?

作为这个问题的扩展(请先回答第一位:-),我将非常感谢知道如何阅读此代码,该代码位于具有多个Boot.scala文件的项目中.

Web包中的Boot.scala:

trait Web {
  this: Api with Core =>
....
}
Run Code Online (Sandbox Code Playgroud)

api包中的Boot.scala:

trait Api {
  this: Core =>
....
}
Run Code Online (Sandbox Code Playgroud)

核心包中的Boot.scala:

trait Core {
  implicit def actorSystem: ActorSystem
  implicit val timeout = Timeout(30000)

  val application = actorSystem.actorOf(
    props = Props[ApplicationActor],
    name = "application"
  )

  Await.ready(application ? Start(), timeout.duration)

}
Run Code Online (Sandbox Code Playgroud)

可以认为一个包依赖于另一个包,并且Boot.scala文件可能是基于actor的系统中的常见视图,但是如何"读取"关系呢?例如,我如何用英语阅读trait Web {this:Api with Core => ...}?

在特定实例中,应用程序的起点位于主文件中:

object Main extends App {
  implicit val system = ActorSystem("RESTService")

  class Application(val actorSystem: ActorSystem) extends Core with Api with Web {

  }

  new Application(system)

  sys.addShutdownHook {
    system.shutdown()
  }

}
Run Code Online (Sandbox Code Playgroud)

我意识到我的问题对某些人来说似乎微不足道,但我想在这里进入Scala部落,并且"秘密密码"不在任何手册中.

Kim*_*bel 5

我不知道Boot.scala是否是一种常见的模式,但它在Lift中使用并包含应用程序的主要配置.由于Lift相当陈旧(相对于其他scala项目),它可能已经设置了一个约定.

对于另一个问题,你应该阅读蛋糕模式自我类型.例如

trait Web {
  this: Api with Core =>
....
}
Run Code Online (Sandbox Code Playgroud)

定义一个特征Web,该特征只能混合到从其自身类型继承API和/ Core或具有这些特征的类或特征中.从而

class Application(val actorSystem: ActorSystem) extends Core with Api with Web {

}
Run Code Online (Sandbox Code Playgroud)

如果Api特征未混入,则不会进行类型检查,因为Web特征需要它.