Scala Spray REST API应用结构-需要建议

Scala Spray REST API应用结构-需要建议,scala,spray,Scala,Spray,我使用sbt构建了以下多模块项目结构: myProject-api myProject-core 我的项目核心组织如下: trait MyProjectConfig { def actorSystem: ActorSystem // the actors def userActor: ActorRef } object MyProjectConfig { def apply(appConfig: Config, system: ActorSystem): MyProjec

我使用sbt构建了以下多模块项目结构:

myProject-api
myProject-core
我的项目核心组织如下:

trait MyProjectConfig {

  def actorSystem: ActorSystem

  // the actors
  def userActor: ActorRef
}
object MyProjectConfig {

  def apply(appConfig: Config, system: ActorSystem): MyProjectConfig = {

    new MyProjectConfig {
      private val dbConfig = loadDBConfig(appConfig)

      override val actorSystem = system

      // each actor gets its own DBConfigInstance instance
      override val userActor =
        actorSystem.actorOf(
          Props(new UserActor(UserService(dbConfig)))
        )
    }
  }
}
它包含某些角色,充当我服务的门面。例如,我有一个坐在UserService前面的UserActor。坐在NotificationService前面的NotificationActor等

我还有一个特点,就是向任何感兴趣的人展示这些演员:

trait MyProjectCoreActors {

  def myAppCfg = MyProjConfig.appCfg      

  def userActor = myAppCfg.userActor
  def notifyActor = myAppCfg.notifyActor
}
object MyProjectCoreActors {

  ... some initialization routing that initializes the MyProjConfig
}
因此,我的UserActor定义为:

class UserActor(service: UserService) extends Actor {

  ...
  ...
}
我的用户服务如下:

class UserService(dbConfig: DbConfig) {

  ...
  ...
}
我有另一个名为MyProjectConfig的类,我使用application.conf文件初始化它。在这个文件中,我有到数据库的连接细节等等。MyProjectConfig的初始化如下所示:

trait MyProjectConfig {

  def actorSystem: ActorSystem

  // the actors
  def userActor: ActorRef
}
object MyProjectConfig {

  def apply(appConfig: Config, system: ActorSystem): MyProjectConfig = {

    new MyProjectConfig {
      private val dbConfig = loadDBConfig(appConfig)

      override val actorSystem = system

      // each actor gets its own DBConfigInstance instance
      override val userActor =
        actorSystem.actorOf(
          Props(new UserActor(UserService(dbConfig)))
        )
    }
  }
}
我现在有了如下定义的喷洒路线:

trait MyProjectService extends HttpService with MyProjectCoreActors {

  def pingRoute = path("ping") {
    get {
      userActor ! "newUser"
      complete("pong!")
    }
  }

  def pongRoute = path("pong") {
    get { complete("pong!?") }
  }

  def route = pingRoute ~ pongRoute
}
现在缺少的是调用MyProjectConfig.apply(..)方法并传入Actor系统和底层application.conf的方法

这最初是一个基于播放的应用程序,我有一个生命周期插件,可以从中访问底层应用程序,从中我可以获得配置和actor系统。我现在怎么能用喷雾剂得到同样的效果呢

我有一个引导类,如下所示:

object MyBootHttpService extends App {

  implicit val actorSystem = ActorSystem("myproj-actor-system")

}

如何将此ActorSystem传递给MyProjectConfig.apply(..)?我从哪里可以得到application.conf?

我想你可以在你的
MyBootHttpService
类中做这样的事情(DI)

比如说

object MyBootHttpService extends App {

  implicit val actorSystem = ActorSystem("myproj-actor-system")
  private val config = ConfigFactory.load
  private val myAppConfig = MyProjectConfig(config, actorSystem)

  // Initialise classes that depend on config and actorsystem....
  private val service = new MyProjectService with HttpServiceActor {
     override implicit val actorRefFactory = actorSystem
  }
  // Bind our service
  IO(Http) ? Bind(listener = service, interface = "0.0.0.0", port = config.getInt("port"))

}

Typesafe配置库对象
ConfigFactory
通常用于加载配置文件
ConfigFactory.load
不带参数将尝试从类路径加载
application.conf

我认为您可以在您的
MyBootHttpService
类中执行此类操作(DI)

比如说

object MyBootHttpService extends App {

  implicit val actorSystem = ActorSystem("myproj-actor-system")
  private val config = ConfigFactory.load
  private val myAppConfig = MyProjectConfig(config, actorSystem)

  // Initialise classes that depend on config and actorsystem....
  private val service = new MyProjectService with HttpServiceActor {
     override implicit val actorRefFactory = actorSystem
  }
  // Bind our service
  IO(Http) ? Bind(listener = service, interface = "0.0.0.0", port = config.getInt("port"))

}
Typesafe配置库对象
ConfigFactory
通常用于加载配置文件
ConfigFactory.load
不带参数将尝试从类路径加载
application.conf