2016-05-22 10 views
0

Bei der Definition Scala Controller es eine Klasse als Singleton markieren die @Singleton Annotation verwenden:@Singleton in Scala spielt Rahmen

@Singleton 
class Application 

https://docs.oracle.com/javaee/7/api/javax/inject/Singleton.html Singletons definiert als ‚eine Art identifiziert, dass der Injektor nur einmal instanziiert. Nicht geerbt. also spielt Scala das Abhängigkeitsinjektions-Framework, das auf Java-Abhängigkeitsinjektion setzt?

Von https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection 'Play unterstützt sowohl die Laufzeitabhängigkeitsinjektion basierend auf JSR 330 (auf dieser Seite beschrieben) als auch die Kompilierungszeitabhängigkeitsinjektion in Scala.' Verwendet @Singleton unter Verwendung von 'Abhängigkeitsinjektion basierend auf JSR 330', um 'Compilierungszeitabhängigkeitsinjektion in Scala' zu verwenden, was ist erforderlich?

Antwort

0

ist Scala Play Abhängigkeitsinjektion Framework auf Java Abhängigkeitsinjektion verlassen?

Ja, also Sie müssen import javax.inject._ jede Datei schreiben, die Sie DI verwenden.

Was müssen Sie im Grunde zu tun ist,

· Schnittstelle definieren als trait

trait FooService { 
    def getBar(baz: String):Future[Bar] 
} 

· Implementieren Sie die Schnittstelle

class FooServiceImpl extends FooService { 
    def getBar(baz: String) = ??? 
} 

· über Module.scala Binde sie (guice Stil)

class Module extends AbstractModule { 
    override def configure() = { 
    bind(classOf[FooService]).to(classOf[FooServiceImpl]) 
    } 
} 
0 Verwenden Sie

· es

class FooController @Inject()(fooService: FooService)(implicit exec: ExecutionContext) extends Controller { 
    def index = Action.async = { 
    fooService.getBar("fooBar").map{_.doWhatEverYouWant} 
    ..... 
    } 
} 

Wie Sie sehen können, müssen Sie Klassenparameter definieren, wenn Sie diese Art der DI.This verwenden ist der Grund, warum Sie nicht Scala object und @Singleton können stattdessen verwenden.

+0

also kann nicht Objektparameter anstelle von Klassenparametern deklarieren Objekt statt Klasse zu verwenden? Kompilierzeit DI scheint mächtiger als Laufzeit, ist Grund, Runtime-DI-Leichtigkeit der Einrichtung und Konfiguration zu verwenden? –

+0

@ blue-sky Was ist 'Objektparameter'? Sowieso. Es ist etwas peinlich, '@ singleton' statt' object' zu verwenden, obwohl es nicht zu lange dauert, um es zu benutzen. Laufzeit DI wurde besser lose Kopplung und Testbarkeit, aber weniger typisiert. – suish

+0

kann also ein Scala-Objekt als Singleton anstelle von Singleton-Annotation verwendet werden? Mit 'Objekt-Parameter' meinte ich, wenn man ein Scala-Objekt benutzt (also keine Singleton-Annotation benutzt), 'fooService: FooService' in das Scala-Objekt statt in die Scala-Klasse –

0

Der Hauptunterschied zwischen Compiletime und Runtime DI ist, dass Sie mit Runtime DI nicht wissen, ob Ihre Abhängigkeiten verdrahtet und erfüllt werden, bis Sie Ihre Anwendung ausführen (dh Sie erhalten einen Laufzeitfehler statt Kompilierzeitfehler)

Für weitere Informationen über die Kompilierzeit DI-Unterstützung, ich schlage vor, dass Sie in die official documentation darüber schauen.