Scala Spray REST API应用结构-需要建议
我使用sbt构建了以下多模块项目结构: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
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