Jak korzystać z Guice's AssistedInject?

Odpowiedzi:

168

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);
Mairbek Khadikov
źródło
8
Dużo szukałem i nie mogłem znaleźć bardziej zwięzłego i jasnego wyjaśnienia moich wątpliwości. Wielkie dzięki
Gabber
18
Jest to łatwiejsze do zrozumienia niż dokumentacja na Github. Dobra robota.
arjabbar
8
W porównaniu z tym dokumentacja Github jest do niczego.
EMM,
2
Czy w wywołaniu metody „Płatność” nie należy przekazywać „daty” i „kwoty”? Dlaczego mają być wstawiane tutaj w konstruktorze?
Harshit
2
Dla tych, którzy się zastanawiają, RealPaymentnie trzeba implementować interfejsu.
jsallaberry,