Comment utiliser l'AssistedInject de Guice?

Réponses:

168

Vérifiez le javadoc de la classe FactoryModuleBuilder .

AssistedInjectvous permet de configurer dynamiquement la Factoryclasse au lieu de la coder vous-même. Ceci est souvent utile lorsque vous avez un objet qui a des dépendances qui doivent être injectées et certains paramètres qui doivent être spécifiés lors de la création de l'objet.

Un exemple de la documentation est un RealPayment

public class RealPayment implements Payment {
   @Inject
   public RealPayment(
      CreditService creditService,
      AuthService authService,
      @Assisted Date startDate,
      @Assisted Money amount) {
     ...
   }
 }

Voyez cela CreditServiceet AuthServicedevrait être injecté par le conteneur, mais startDate et montant doivent être spécifiés par un développeur lors de la création de l'instance.

Donc, au lieu d'injecter un, Paymentvous injectez un PaymentFactoryavec des paramètres marqués comme @AssisteddansRealPayment

public interface PaymentFactory {
    Payment create(Date startDate, Money amount);
}

Et une usine devrait être liée

install(new FactoryModuleBuilder()
     .implement(Payment.class, RealPayment.class)
     .build(PaymentFactory.class));

L'usine configurée peut être injectée dans vos classes.

@Inject
PaymentFactory paymentFactory;

et utilisé dans votre code

Payment payment = paymentFactory.create(today, price);
Mairbek Khadikov
la source
8
J'ai beaucoup cherché et je n'ai pas trouvé d'explication plus concise et plus claire à mes doutes. Merci beaucoup
Gabber
18
C'est plus facile à comprendre que la documentation sur Github. Bien joué.
arjabbar
8
La documentation Github est de la merde par rapport à cela.
EMM
2
La «date» et le «montant» ne devraient-ils pas être transmis dans l'appel de méthode à «paiement»? Pourquoi devraient-ils être injectés ici dans le constructeur?
Harshit
2
Pour ceux qui se demandent, RealPaymentn'a pas besoin de mettre en œuvre une interface.
jsallaberry