¿Cómo utilizar AssistedInject de Guice?

Respuestas:

168

Verifique el javadoc de la clase FactoryModuleBuilder .

AssistedInjectle permite configurar dinámicamente la Factoryclase en lugar de codificarla 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.

El 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) {
     ...
   }
 }

Ver eso CreditServiceyAuthService debe ser inyectado por contenedor, pero el desarrollador debe especificar startDate y la cantidad durante la creación de la instancia.

Entonces, en lugar de inyectar a Payment, está inyectando a PaymentFactorycon parámetros que están marcados como @AssistedenRealPayment

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

Y una fábrica debería estar encuadernada

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);
Mairbek Khadikov
fuente
8
Busqué mucho y no pude encontrar una explicación más concisa y clara a mis dudas. Muchas gracias
Gabber
18
Esto es más fácil de entender que la documentación de Github. Bien hecho.
arjabbar
8
La documentación de Github es una mierda en comparación con esto.
EMM
2
¿No deberían pasarse la 'fecha' y la 'cantidad' en la llamada al método a 'Pago'? ¿Por qué deberían inyectarse aquí en el constructor?
Harshit
2
Para aquellos que se preguntan, RealPaymentno es necesario implementar una interfaz.
jsallaberry