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()?
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
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