6

Ho difficoltà a capire come applicare la nuova funzionalità di Dependency Injection in Play 2.4. Conosco Guice e manco nella Documentazione di gioco una spiegazione su come e quando avviene il legame effettivo. Ho letto il documento ufficiale [1] e ho provato a usare l'ultimo Play Mailer [2] come esempio. L'esempio Play Mailer utilizza una classe arbitraria e annota la proprietà MailerClient con @inject. Quando provo a utilizzare un oggetto di questa classe, la proprietà è null, almeno durante il debug. Quindi, dove e quando devo fare l'iniezione vera e propria? Ho lo stesso problema per l'annotazione @singleton. Viene semplicemente spiegato come annotarlo, ma non come ottenere un oggetto. Devo usare Guice direttamente o è integrato come?Informazioni su Play 2.4 Iniezione delle dipendenze

[1] https://www.playframework.com/documentation/2.4.x/JavaDependencyInjection

[2] https://github.com/playframework/play-mailer

+0

Puoi mostrarci il tuo codice? – Salem

+0

Fondamentalmente è simile all'esempio ufficiale Play Mailer. Avvio 'MyComponent' in un'altra classe e chiamo il metodo' sendMail() '. – linsenfips

+0

Sono anche confuso da questo e mi piacerebbe vedere altri esempi là fuori. Sto scrivendo un codice S3 e ho un oggetto S3File dipendente da un S3Service che dovrebbe essere iniettato. Come posso creare una nuova istanza di S3File con S3Service iniettato in esso? Creo un iniettore nel mio controller? In tal caso, suppongo che userò "injector.getInstance (S3File.class)" invece di "new S3File"? Come faccio a creare l'iniettore: sembra eccessivo dover creare un impl specifico di AbstractModule per eseguire il binding per questa classe. Cosa fa @ImplementedBy sulla mia interfaccia, se non questo? – eljaydub

risposta

1

credo, l'associazione sta accadendo attraverso MailerModule aggiunto play.modules.enabled. MailerModule fornisce l'associazione Guice per MailerClient.

play { 
    modules { 
    enabled += "play.api.libs.mailer.MailerModule" 
    } 

Per Guice per iniettare MailerClient nel proprio oggetto, dovrebbe essere creato tramite Guice. Ad esempio, se si desidera utilizzare @Inject MailerClient in un controller o un servizio immesso nel controller, il controller deve essere iniettato tramite Guice. Recommended approach for this in Play 2.4 sta aggiungendo quanto segue al file build.sbt:

routesGenerator := InjectedRoutesGenerator 
+0

Sì, esattamente. Questo è quello che pensavo. Deve essere iniettato attraverso Guice. Capisco come si fa con 'InjectedRoutesGenerator', perché lì c'è qualche istanza, che sta facendo l'iniezione. Ma nella documentazione di Play Mailer ciò non avviene in un controller, ma all'interno di una classe casuale. Quindi chi è responsabile allora? – linsenfips

+0

@linsenfips Se si suppone che il campo MailerClient sia iniettato, questo oggetto di 'classe casuale' deve essere creato tramite Guice. In alternativa, è possibile impostare manualmente il campo, utilizzando Costruttore/Setter, se si desidera saltare completamente DI. – bravo2

+0

Grazie! È quello che pensavo. Ma ancora: come faccio a farlo. Gli sviluppatori di Play hanno integrato Guice strettamente nel framework. Allora, qual è il "modo ufficiale di giocare" di creare un oggetto attraverso Guice? – linsenfips