naprawdę lubię Devabc's solution ponieważ istnieją pewne scenariusze, które nie mogą polegać na iniekcji konstruktora, aby uzyskać sam wtryskiwacz, zamiast tego w wersji 2.5.x należy użyć wycofanego kodu play.api.Play.current.Injector
, aby uzyskać wtryskiwacz.
Jego rozwiązanie tworzy odniesienie do wbudowanego wtryskiwacza Play i umieszcza go w obiekcie Scala, który może zostać zaimportowany przez dowolny komponent, gdy zajdzie taka potrzeba. Znakomity!
Aby to działało, obiekt musi jednak udostępnić interfejs publiczny, aby uzyskać wtryskiwacz, więc oto mój poprawiony kod, aby go naprawić i pokazać, jak można go użyć.
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
}
Część inicjalizacyjna jest taka sama.
// 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"
Kod klienta jest bardzo prosty. W zależności od tego, który komponent wymaga wtryskiwacza:
Czy mógłbyś jeszcze bardziej rozwinąć tutaj? Dlaczego potrzebujesz dostępu do wtryskiwacza? – marcospereira
@marcospereira Użyłem Guice FactoryModuleBuilder do wdrożenia fabryki, która zwraca inną fabrykę w czasie pracy! na drugim poziomie powracającej fabryki muszę uzyskać dostęp do Play guice Injector, aby ręcznie pobrać obiekty za pomocą odbicia zamiast innotacji Inject. –
Pytam, ponieważ powinieneś unikać używania 'Play.current', ponieważ zostanie on w pewnym momencie usunięty. Może możesz wstrzyknąć wtryskiwacz? – marcospereira