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 .
AssistedInject
pozwala na dynamiczne konfigurowanie Factory
zajęć 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 CreditService
i AuthService
powinny być wstrzykiwane przez kontener, ale programista powinien określić datę startu i kwotę podczas tworzenia instancji.
Więc zamiast wstrzykiwać a Payment
, wstrzykujesz a PaymentFactory
z parametrami oznaczonymi jako @Assisted
inRealPayment
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);
RealPayment
nie trzeba implementować interfejsu.