Gin @inject su variabile per i servizi RPC
-
28-10-2019 - |
Domanda
Sono un po 'perso con l'uso dell'iniezione su variabile.
Ho fatto funzionare questo codice:
private XXServiceAsync xxServiceAsync;
@Inject
protected IndexViewImpl(EventBus eventBus, XXServiceAsync tableManagementServiceAsync) {
super(eventBus, mapper);
this.xxServiceAsync = xxServiceAsync;
initializeWidgets();
}
Con questo codice, posso chiamare il mio servizio RPC ovunque ho bisogno nella classe (su clic ...) Vorrei cancellare un po 'il codice iniettando direttamente nella variabile; così facendo :
@Inject
private XXServiceAsync xxServiceAsync;
protected IndexViewImpl(EventBus eventBus) {
super(eventBus, mapper);
initializeWidgets();
}
Questo mantiene sempre il servizio nullo. Sto facendo qualcosa di sbagliato ? La magia Gin con i servizi RPC dovrebbe essere fatto diversamente?
Grazie!
Soluzione
A quel punto è ancora nullo, perché Gin (e Guice e altri framework come questo) non possono assegnare i campi fino a quando il costruttore non ha finito di funzionare.
Considera come sarebbe questo se stavi cablando manualmente il codice (ricorda che Gin/Guice imbroglia un po 'per assegnare campi privati, chiama metodi non visibili):
MyObject obj = new MyObject();//initializeWidgets() runs, too early!
obj.xxServiceAsync = GWT.create(xxService.class);
Se hai bisogno di qualcosa nel costruttore, passalo nel costruttore. Se non ne avrai bisogno subito (come fino a quando non viene chiamato Aswidget ()), allora un campo o un setter annotato con @Inject può essere utile.
Altri suggerimenti
Se si dispone di iniezione a livello di campo è possibile utilizzare un metodo @inject vuoto per eseguire l'inizializzazione post-iniezione. Il metodo iniettato no-arg verrà eseguito dopo che le iniezioni di campo sulla classe sono completate.
@Inject void initialize(){
...
initializeWidgets()
}
EDIT: in precedenza ho affermato che è stato eseguito anche dopo l'iniezione del metodo, ma i test mostrano che non è sempre così.