Przeczytałem https://github.com/google/guice/wiki/AssistedInject , ale nie mówi, jak przekazać wartości argumentów AssistedInject. Jak wyglądałoby wywołanie injector.getInstance ()?
Przeczytałem https://github.com/google/guice/wiki/AssistedInject , ale nie mówi, jak przekazać wartości argumentów AssistedInject. Jak wyglądałoby wywołanie injector.getInstance ()?
Odpowiedzi:
Sprawdź javadoc klasy FactoryModuleBuilder .
AssistedInjectpozwala na dynamiczne konfigurowanie Factoryzajęć zamiast samodzielnego kodowania. Jest to często przydatne, gdy masz obiekt, który ma zależności, które powinny zostać wstrzyknięte i niektóre parametry, które muszą zostać określone podczas tworzenia obiektu.
Przykład z dokumentacji to RealPayment
public class RealPayment implements Payment {
@Inject
public RealPayment(
CreditService creditService,
AuthService authService,
@Assisted Date startDate,
@Assisted Money amount) {
...
}
}
Zobacz to CreditServicei AuthServicepowinny być wstrzykiwane przez kontener, ale programista powinien określić datę startu i kwotę podczas tworzenia instancji.
Więc zamiast wstrzykiwać a Payment, wstrzykujesz a PaymentFactoryz parametrami oznaczonymi jako @AssistedinRealPayment
public interface PaymentFactory {
Payment create(Date startDate, Money amount);
}
I trzeba związać fabrykę
install(new FactoryModuleBuilder()
.implement(Payment.class, RealPayment.class)
.build(PaymentFactory.class));
Skonfigurowaną fabrykę można wstrzyknąć do swoich klas.
@Inject
PaymentFactory paymentFactory;
i użyte w Twoim kodzie
Payment payment = paymentFactory.create(today, price);
RealPaymentnie trzeba implementować interfejsu.