2010-04-13 16 views
7

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í.

+0

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

+0

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. –

Respuesta

3

¿Podría usar Multibinding para enlazar todas sus pestañas como Set? Si implementaban alguna interfaz que le permitiera obtener el nombre para usar en la pestaña, podría simplemente agregar las pestañas del conjunto. Sin embargo, es probable que necesites encontrar algo para pedir las pestañas.

+0

Una posibilidad que consideraré. Creo que Multibinding es solo para casos en los que no se conoce la cantidad de objetos que se obtendrán o sus tipos reales. En este caso, sé exactamente cuántos y qué tipos, simplemente no quiero construirlos manualmente, así que no creo que Multibinding sea lo suficientemente bueno para lo que quería hacer. –

+0

Estoy de acuerdo con @ColinD. +1 para multibindings – gpampara

0

No podría usted acaba de inyectar el servicio en el JFrame y dejar que las lengüetas de solicitar el servicio/configuración, al igual que

this.getTopLevelAncestor().getService() 

Por supuesto, esto sólo funciona si llama después de que hayan sido añadidos a un contenedor .

+2

Creo que eso empeoraría aún más el espagueti. Agregaría muchos moldes a 'MainFrame' y realmente reduciría el potencial de reutilización de cualquiera de estas clases porque estarían estrechamente vinculadas a' MainFrame' en lugar de solo a sus dependencias como lo están haciendo ahora. –

Cuestiones relacionadas