/ / Gioca con scala - Iniezione di dipendenze attraverso un'istanza di Guice Injector - scala, playframework, guice

Gioca con scala - Iniezione di dipendenze attraverso un'istanza di Guice Injector - scala, playframework, guice

La mia applicazione fa uso di Play-2.4.2 / Scala-2.11.6 che viene fornito con il supporto Guice integrato per DI

Tutti i miei DAO vincolano un'implementazione a un'interfaccia come sotto, che dovrebbe essere il modo più semplice in Guice

@ImplementedBy(classOf[PersonDAOImpl])
trait PersonDAO {
}

class PersonDAOImpl @Inject()
(
(@NamedDatabase("mysql")protected val dbConfigProvider: DatabaseConfigProvider,
protected val cache : CacheApi) extends PersonDAO with SQLWrapper {
..
...

}

L'implementazione di cui sopra non ha bisogno di aggiungere alcun modulo per fornire associazioni.

Ora per qualche ragione, io non voglio iniettare le dipendenze nel costruttore di libri di classe usando l'annotazione @Inject . Quindi, ho provato a iniettarlo come di seguito

class Books {

val injector = Guice.createInjector()

val personDAO : PersonDAO = injector.getInstance(classOf[PersonDAOImpl])

..
...

}

Ma questo mi getta un'eccezione di configurazione guiziana dicendo:

Caused by: com.google.inject.ConfigurationException: Guice configuration errors:

1) No implementation for play.api.cache.CacheApi was bound.
while locating play.api.cache.CacheApi
for parameter 1 at schema.PersonDAOImpl.<init>
while locating PersonDAO

2)  No implementation for play.api.db.slick.DatabaseConfigProvider annotated with @play.db.NamedDatabase(value=mysql) was bound.
while locating play.api.cache.CacheApi
for parameter 2 at schema.PersonDAOImpl.<init>  while locating PersonDAO

Cosa deve essere fatto ora? Il mio approccio è giusto o sbagliato in questo caso? Qualcuno può aiutarmi con questo? Grazie in anticipo.

risposte:

3 per risposta № 1

Puoi usare il Iniettore dal gioco corrente Applicazione.

import play.api.{ Application, Play }
import play.api.inject.Injector

val currentApp: Application = Play.current
val injector: Injector = currentApp.injector
// in short play.api.Play.current.injector

// Then use the injector
import play.api.inject.ApplicationLifecycle
current.injector.instanceOf[ApplicationLifecycle].
addStopHook { () => ??? }

(Vedi esempio usando injector con il Riproduci plug-in per ReactiveMongo)