Wie verwende ich Guices AssistedInject?

Antworten:

166

Überprüfen Sie das Javadoc der FactoryModuleBuilder- Klasse.

AssistedInjectMit dieser Option können Sie die FactoryKlasse dynamisch konfigurieren , anstatt sie selbst zu codieren. Dies ist häufig nützlich, wenn Sie ein Objekt haben, dessen Abhängigkeiten eingefügt werden sollen, und einige Parameter, die beim Erstellen des Objekts angegeben werden müssen.

Beispiel aus der Dokumentation ist a RealPayment

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

Sehen Sie sich das an CreditServiceund AuthServicesollten vom Container injiziert werden, aber startDate und die Menge sollten von einem Entwickler während der Instanzerstellung angegeben werden.

Anstatt also a zu injizieren, injizieren PaymentSie a PaymentFactorymit Parametern, die als @Assistedin markiert sindRealPayment

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

Und eine Fabrik sollte gebunden werden

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

Die konfigurierte Fabrik kann in Ihre Klassen injiziert werden.

@Inject
PaymentFactory paymentFactory;

und in Ihrem Code verwendet

Payment payment = paymentFactory.create(today, price);
Mairbek Khadikov
quelle
8
Ich habe viel gesucht und konnte keine präzisere und klarere Erklärung für meine Zweifel finden. Vielen Dank
Gabber
18
Dies ist leichter zu verstehen als die Dokumentation zu Github. Gut gemacht.
Arjabbar
8
Die Github-Dokumentation ist im Vergleich dazu Mist.
EMM
2
Sollten "Datum" und "Betrag" nicht im Methodenaufruf an "Zahlung" weitergegeben werden? Warum sollten sie hier im Konstruktor injiziert werden?
Harshit
2
Für diejenigen, die sich fragen, RealPaymentmuss keine Schnittstelle implementiert werden.
jsallaberry