wirklich wie Devabc's solution weil es definitiv einige Szenarien gibt, die sich nicht auf die Konstruktorinjektion stützen können, um den Injektor selbst zu erhalten, stattdessen müssen Sie in Play 2.5.x den veralteten play.api.Play.current.Injector
Code verwenden, um den Injektor zu erhalten.
Seine Lösung erstellt einen Verweis auf den Play-Injektor und legt ihn in ein Scala-Objekt, das von jeder Komponente bei Bedarf importiert werden kann. Brillant!
Um es funktionieren zu lassen, muss das Objekt jedoch eine öffentliche Schnittstelle zur Verfügung stellen, um den Injektor zu bekommen, also ist hier mein geänderter Code, um ihn zu reparieren und zu demonstrieren, wie er benutzt werden kann.
import play.api.inject.Injector
import javax.inject.Inject
@Singleton
class GlobalContext @Inject()(playInjector: Injector) {
GlobalContext.injectorRef = playInjector
}
object GlobalContext {
private var injectorRef: Injector = _
def injector: Injector = injectorRef
}
Der Initialisierungsteil ist derselbe.
// InjectionModule.scala
package modules
class InjectionModule extends AbstractModule {
override def configure() = {
// ...
// Eager initialize Context singleton
bind(classOf[GlobalContext]).asEagerSingleton()
}
}
// application.conf
play.modules.enabled += "modules.InjectionModule"
Und der Client-Code ist recht einfach. Für welche Komponente auch der Injektor benötigt wird:
// Import the object GlobalContext
import GlobalContext.injector
// ...
val yourClassInstance = injector.instanceOf[YourClass]
Könnten Sie bitte mehr hier ausführen? Warum müssen Sie auf den Injektor zugreifen? – marcospereira
@marcospereira Ich habe Guice FactoryModuleBuilder für die Implementierung einer Fabrik verwendet, die eine andere Fabrik in der Laufzeit zurückgibt! In der zweiten Ebene der zurückkehrenden Fabrik muss ich auf Play guice Injector zugreifen, um Objekte manuell zu erhalten, indem ich Reflektion anstelle von Inject annotation verwende. –
Ich fragte, weil Sie 'Play.current' vermeiden sollten, da es irgendwann entfernt wird. Vielleicht können Sie den Injektor injizieren? – marcospereira