2015-11-06 45 views
1

我有以下的多模块项目结构使用SBT内置:喷雾REST API应用程序结构 - 建议所需

myProject-api 
myProject-core 

myProject的核心的组织结构如下:

它包含作为行为的某些行为给我的服务一个门面。例如,我有一个位于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 { 

    ... 
    ... 
} 

我UserService如下:

class UserService(dbConfig: DbConfig) { 

    ... 
    ... 
} 

我有另一个名为MyProjectConfig的类,我使用application.co初始化nf文件。在这个文件中,我有连接细节到数据库等等。定义见下文

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(....)的MyProjectConfig被如下初始化方法并传入Actor系统和底层application.conf!

这最初是一个基于Play的应用程序,我有一个Lifecycle插件,可以从中获取配置和演员系统的底层应用程序。我现在怎么能和Spray一样呢?

我有一个启动类,看起来像这样:

object MyBootHttpService extends App { 

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

} 

我怎么能忽略这ActorSytem到MyProjectConfig.apply(....)?并从哪里可以得到application.conf?

回答

0

我认为你可以在你的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")) 

} 

类型安全配置库对象ConfigFactory通常用于加载配置文件。没有参数的ConfigFactory.load将尝试从类路径加载application.conf