Come utilizzare AssistedInject di Guice?


Risposte:


171

Controlla il javadoc della classe FactoryModuleBuilder .

AssistedInjectti permette di configurare dinamicamente Factoryper la classe invece di codificarla da solo. Questo è spesso utile quando si dispone di un oggetto che ha delle dipendenze che dovrebbero essere iniettate e alcuni parametri che devono essere specificati durante la creazione dell'oggetto.

Un esempio dalla documentazione è un file RealPayment

public class RealPayment implements Payment {
   @Inject
   public RealPayment(
      CreditService creditService,
      AuthService authService,
      @Assisted Date startDate,
      @Assisted Money amount) {
     ...
   }
 }

Vedi quello CreditServicee AuthServicedovrebbe essere iniettato dal contenitore, ma startDate e importo dovrebbero essere specificati da uno sviluppatore durante la creazione dell'istanza.

Quindi, invece di iniettare un, Paymentstai iniettando un PaymentFactorycon parametri contrassegnati come @AssistedinRealPayment

public interface PaymentFactory {
    Payment create(Date startDate, Money amount);
}

E una fabbrica dovrebbe essere vincolata

install(new FactoryModuleBuilder()
     .implement(Payment.class, RealPayment.class)
     .build(PaymentFactory.class));

La fabbrica configurata può essere iniettata nelle tue classi.

@Inject
PaymentFactory paymentFactory;

e utilizzato nel codice

Payment payment = paymentFactory.create(today, price);

8
Ho cercato molto e non sono riuscito a trovare una spiegazione più concisa e chiara ai miei dubbi. Molte grazie
Gabber

18
Questo è più facile da capire rispetto alla documentazione su Github. Molto bene.
arjabbar

8
La documentazione di Github è una schifezza rispetto a questa.
EMM

2
"Data" e "importo" non dovrebbero essere passati nella chiamata al metodo a "Pagamento"? Perché dovrebbero essere iniettati qui nel costruttore?
Harshit

2
Per chi si chiede, RealPaymentnon necessita di implementare un'interfaccia.
jsallaberry
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.