2014-08-24 3 views
3

Я использую Spray для конечных точек REST. Как я могу получить доступ к существующему ActorSystem внутри черты?
Я не хочу создавать новый ActorSystem внутри моей черты (если возможно), а скорее повторное использование мой существующий ActorSystem. Я использую this Клиентскую библиотеку Redis.Получение доступа к существующей системе ActorSystem внутри признака

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 
      } 
     } 
    } 

} 

ответ

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 
       } 
      } 
     } 

    } 
5

Другим способом достижения этого является использование аннотаций самонастройки.

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

С провозглашением самостоятельного типа, вы указываете, что класс простирающийся от этого признака будет также распространяться от актера (который будет в любом случае сделать, чтобы запустить маршрут). В противном случае компилятор будет генерировать ошибку. После объявления самостоятельного типа вы можете пойти и использовать любого из участников Актера.

Таким образом, дополнительных методов для реализации нет.

Смежные вопросы