Actualmente estoy experimentando con la inversión de guice de Google en el contenedor de control. Anteriormente tenía singletons para casi cualquier servicio (base de datos, directorio activo) que mi aplicación usara. Ahora refactoreé el código: todas las dependencias se dan como parámetros a los constructores. Hasta aquí todo bien. Ahora la parte más difícil es con la interfaz gráfica de usuario. Me enfrento a este problema: tengo una tabla (JTable) de productos envueltos en un ProductFrame. Doy las dependencias como parámetros (EditProductDialog).¿La inyección de dependencia es solo para objetos de tipo de servicio y singletons? (y NO para GUI?)
@Inject
public ProductFrame(EditProductDialog editProductDialog) {
// ...
}
// ...
@Inject
public EditProductDialog(DBProductController productController, Product product) {
// ...
}
El problema es que guice no puede saber qué producto que he seleccionado en la tabla, por lo que no puede saber lo que inyectar en el EditProductDialog.
Dependency Injection es bastante viral (si modifico una clase para usar la inyección de dependencia también tengo que modificar todas las demás clases con las que interactúa) entonces mi pregunta es ¿debo instanciar directamente EditProductDialog? Pero luego tendría que pasar manualmente DBProductController a EditProductDialog y también tendré que pasarlo al ProductFrame y todo esto se reducirá a no usar ninguna inyección de dependencia.
¿O mi diseño es defectuoso y por eso no puedo adaptar el proyecto a la inyección de dependencia?
Dame algunos ejemplos de cómo usaste la inyección de dependencia con la interfaz gráfica de usuario. Todos los ejemplos que se encuentran en Internet son ejemplos muy simples en los que se usan algunos servicios (principalmente bases de datos) con inyección de dependencia.
Estaba pensando en la misma solución, pero no estaba seguro de que sea el mejor enfoque, porque con la inyección de dependencias "necesitas declarar tus dependencias" (en el constructor en el caso de guice). Pero esta parece ser la mejor solución en este momento. Gracias por los enlaces. ¡Definitivamente son útiles! –
Otro enfoque que estaba pensando es utilizar guice solo para servicios (base de datos, etc.) y para las clases gui solo para pasar el inyector como parámetro. Tampoco estoy seguro de este enfoque. –
¡No hagas eso! El uso directo de Guice Injector en el código de la aplicación debe considerarse un olor de diseño, esto es contrario a "Inversión de control" y se parece al "patrón de fábrica". Solo los marcos o las bibliotecas pueden tener esta necesidad y solo en oportunidades excepcionales. – jfpoilpret