Tengo una aplicación Swing que me gustaría convertir de spaghetti en inyección de dependencia con Guice. Utilizar Guice para proporcionar servicios como la configuración y las colas de tareas va muy bien, pero ahora estoy comenzando con la GUI de la aplicación y no estoy seguro de cómo proceder.Cómo utilizar la aplicación Guice en Swing
La aplicación es básicamente un JFrame
con un montón de pestañas en un JTabbedPane
. Cada una de las pestañas es una subclase JPanel
separada que establece los diversos componentes y necesita servicios para realizar acciones cuando se presionan ciertos botones.
En la aplicación actual, esto parece algo así como esto:
@Inject
public MainFrame(SomeService service, Executor ex, Configuration config) {
tabsPane = new JTabbedPane();
// Create the panels for each tab and add them to the tabbedpane
somePanel = new SomeTabPanel(service, ex, config);
tabsPane.addTab("Panel 1", somePanel);
someOtherPanel = new SomeOtherTabPanel(service, ex, config);
tabsPane.addTab("Panel 2", someOtherPanel);
... do more stuff
}
Obviamente, esto no se sigue exactamente las mejores prácticas DI. No quiero tener que @Inject
las pestañas porque eso me daría un constructor con docenas de parámetros. Quiero usar Guice para inyectar las dependencias requeridas en cualquier objeto de tabulación que necesite sin tener que pasar todas esas dependencias a los constructores de pestañas.
Todas las dependencias de los objetos de la ficha son los servicios que mi Module
conoce, así que básicamente todo lo que que quiero hacer es preguntar Guice para los objetos requeridos y los han construido para mí.
Es posible que desee echar un vistazo al proyecto Guts-GUI (que tengo); este es un marco basado en Guice para escribir aplicaciones Swing. Aunque aún no se ha lanzado oficialmente, actualmente es bastante viable. URL es: http://kenai.com/projects/guts/pages/Guts-gui – jfpoilpret
Lo he examinado brevemente, pero parece que esto implicaría una reescritura completa de la aplicación. Ya tengo un sistema de ejecución de tareas muy potente y bus de eventos, por ejemplo. La aplicación no es grande (aproximadamente 20kloc) pero sigue siendo lo suficientemente grande como para no considerar comenzar de nuevo. –