访问特征中的现有ActorSystem

时间:2014-08-24 13:06:54

标签: scala akka actor spray traits

我正在使用Spray for REST端点。 如何才能访问特征中的现有ActorSystem? 我不想在我的特征中创建新的ActorSystem(如果可能),而是重用我现有的ActorSystem。我正在使用this Redis客户端库。

trait MySprayService extends HttpService with Json4sSupport {

   //the following line requires an implicit ActorSystem 
   val redis = RedisClient(ip,port) 
   ....
   ....
   val simpleRoute = path("simple" / "route") {
       get {
          complete {
             //use Redis here
          }
       }
   }

}

2 个答案:

答案 0 :(得分:5)

实现相同目标的另一种方法是使用自我类型注释。

trait MySprayService extends HttpService with Json4sSupport {
    this: Actor =>
    implicit val sys = context.system
    val redis = RedisClient(ip,port) 
    .....

使用自我类型声明,您指定从此特征扩展的类也必须从Actor扩展(无论如何都要运行该路径)。否则编译器将生成错误。在自我声明之后,您可以继续使用Actor的任何成员。

这样,就没有额外的方法可以实现。

答案 1 :(得分:3)

你可以创建一个返回ActorSystem的抽象方法,然后在一个扩展这个特性的类中提供实现。

trait MySprayService extends HttpService with Json4sSupport {

       implicit def as: ActorSystem 
       //the following line requires an implicit ActorSystem 
       val redis = RedisClient(ip,port) 
       ....
       ....
       val simpleRoute = path("simple" / "route") {
           get {
              complete {
                 //use Redis here
              }
           }
       }

    }