Ich habe https://github.com/google/guice/wiki/AssistedInject gelesen , aber es wird nicht angegeben, wie die Werte der AssistedInject-Argumente übergeben werden sollen. Wie würde der Aufruf vonjektor.getInstance () aussehen?
Ich habe https://github.com/google/guice/wiki/AssistedInject gelesen , aber es wird nicht angegeben, wie die Werte der AssistedInject-Argumente übergeben werden sollen. Wie würde der Aufruf vonjektor.getInstance () aussehen?
Antworten:
Ü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);
RealPaymentmuss keine Schnittstelle implementiert werden.