¿Cómo utilizar AssistedInject de Guice?

2 minutos de lectura

avatar de usuario
noel yap

he leído https://github.com/google/guice/wiki/AssistedInject, pero no dice cómo pasar los valores de los argumentos de AssistedInject. ¿Cómo sería la llamada a injector.getInstance()?

  • relacionado, las respuestas a continuación no cubren casos en los que el mismo tipo se usa varias veces. stackoverflow.com/questions/23553865/…

    – Alejandro Oh

    13 de noviembre de 2017 a las 14:42

avatar de usuario
Mairbek Jadikov

Consulte el javadoc de FactoryModuleBuilder clase.

AssistedInject le permite configurar dinámicamente Factory para la clase en lugar de codificarlo usted mismo. Esto suele ser útil cuando tiene un objeto que tiene dependencias que deben inyectarse y algunos parámetros que deben especificarse durante la creación del objeto.

Ejemplo de la documentación es un RealPayment

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

Mira eso CreditService y AuthService el contenedor debe inyectarlo, pero un desarrollador debe especificar la fecha de inicio y la cantidad durante la creación de la instancia.

Así que en lugar de inyectar un Payment usted está inyectando un PaymentFactory con parámetros que están marcados como @Assisted en RealPayment

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

Y una fábrica debe ser atado

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

La fábrica configurada se puede inyectar en sus clases.

@Inject
PaymentFactory paymentFactory;

y usado en tu código

Payment payment = paymentFactory.create(today, price);

  • Busqué mucho y no pude encontrar una explicación más concisa y clara a mis dudas. Muchas gracias

    – Gabber

    9 de junio de 2014 a las 16:54

  • Esto es más fácil de entender que la documentación en Github. Bien hecho.

    – arjabbar

    23 de marzo de 2016 a las 2:58

  • La documentación de Github es una mierda en comparación con esto.

    – EMM

    16 de julio de 2016 a las 3:36

  • ¿No deberían pasarse ‘fecha’ y ‘monto’ en la llamada de método a ‘Pago’? ¿Por qué deberían inyectarse aquí en el constructor?

    – Harshit

    5 de junio de 2018 a las 11:23


  • Para los que se preguntan, RealPayment no necesita implementar una interfaz.

    – jsallaberry

    12 de julio de 2019 a las 17:51

¿Ha sido útil esta solución?