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.
AssistedInject
Mit dieser Option können Sie die Factory
Klasse 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 CreditService
und AuthService
sollten 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 Payment
Sie a PaymentFactory
mit Parametern, die als @Assisted
in 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);
RealPayment
muss keine Schnittstelle implementiert werden.