2016-07-14 8 views
1

Ich habe einen Akka-Actor in meiner Play-App, der über eine veraltete Methode auf die Play-Konfiguration zugreift.Zugriff auf die Play-Konfiguration von Akka Actor

class MyActor (supervisor: ActorRef) extends Actor { 
    val loc = Play.current.configuration.getString("my.location").get 
    def receive = { case _ => } 
} 

, wenn ich dies tun:

import javax.inject._ 
class MyActor @Inject(configuration: play.api.Configuration) (supervisor: ActorRef) extends Actor { 

Meine Klasse wird nicht kompiliert und die compler kehrt: „Klassendatei Anmerkung Argumente haben als benannte Argumente geliefert werden“

Ich gehe davon aus können Sie nur DI die Konfiguration innerhalb einer Controller-Klasse. Ist es also möglich, von einem Akka Actor aus innerhalb einer Play App auf die Konfiguration zuzugreifen? Ich könnte die Konfiguration während der Konstruktion an den Schauspieler weitergeben oder einfach eine separate Konfigurationsdatei für die Schauspieler haben, aber beide scheinen ziemlich hacky zu sein. Gibt es eine bevorzugte Methode mit der Play API?

Danke!

Antwort

1

Dies ist in meinem Projekt arbeiten:

Module.scala:

class ExampleModule extends AbstractModule with AkkaGuiceSupport { 
    override def configure(): Unit = { 
    bindActor[ExampleActor]("example-actor-name") 
    } 
} 

Actor.scala:

object ExampleActor { 
    def props = Props[ExampleActor] 
} 
@Singleton 
class ExampleActor @Inject()(/*some DI*/) extends Actor { 
... 
} 

Und Sie können dann auch, dass sehr Schauspieler in andere Klassen injizieren (die @Named() ist optional wenn Sie nur eine Actor konfiguriert haben) über DI: SomeOtherClass.scala

@Singleton 
class SomeOtherClass @Inject()(@Named("example-actor-name") exampleActor: ActorRef) { 
    ... 
} 
+0

perfekt Vielen Dank! – awfulHack

1

Die Antwort von Mana über die eleganteste Art und Weise betont DI mit Schauspielern in Play in Kombination zu verwenden, aber in jedem Schauspieler können Sie die Konfiguration wie finden:

context.system.settings.config