2010-07-16 9 views
10

Estoy empezando a jugar con Google Guice como un marco de inyección de dependencia y estoy intentando adaptarlo a un proyecto de tamaño pequeño a mediano que escribí recientemente. Entiendo los conceptos básicos de cómo funciona Guice, pero soy un poco vago en algunos de los detalles de acercamiento. Por ejemplo:Manejando bien con Google Guice

1) Los módulos se utilizan para definir sus enlaces, que luego se introducen en los inyectores. ¿Tiende a poner todo en un módulo o tiende a dividir las cosas en muchos módulos más pequeños?

2) ¿Tiene un inyector en el nivel superior que inyecta todo el árbol de objetos o inyectores múltiples punteados sobre los cuales solo inyecta esas dependencias que realmente necesita inyectar? Estoy pensando en mi propia base de código que, por supuesto, tiene muchas dependencias, pero solo un pequeño puñado que necesito controlar durante las pruebas.

3) Estoy un poco atascado en la mejor manera de obtener mis pruebas de sistema/integraciones utilizando solo módulos de entorno de prueba en lugar de las versiones de producción. Es probable que esta pregunta sea específica para la implementación, pero tengo curiosidad por saber qué métodos usan las personas. Como referencia, mi aplicación es una aplicación web basada en servlet.

¿Alguna otra sugerencia?

Respuesta

13

1) Normalmente dividirá las cosas en varios módulos. Uno de los objetivos de Guice es ayudar a que el código sea modular, y para eso están los módulos. Cómo descifrar esto depende de usted (y, obviamente, no es absolutamente necesario). Una ventaja de los módulos de grano más fino es que puede definir módulos dentro de un paquete particular y hacer que las clases que implementan las interfaces sean privadas. Como el módulo está en el paquete, puede vincular esas clases concretas y se pueden usar para configurar el Injector (en otro paquete). Además, haces que tu código sea más flexible cuando puedes cambiar cómo se hace algo simplemente cambiando un módulo por otro, en lugar de tener que cambiar el código en un único módulo monolítico.

2) Sí, un inyector en el nivel superior que inyecta todo el árbol de objetos es la forma en que generalmente deberían hacerse las cosas. Esto vuelve a lo de los módulos ... úsalas para dividir las dependencias en grupos y usar un inyector.

3) Utilice una clase de punto de entrada diferente que configura el inyector. Para una aplicación independiente, tendría una clase diferente main ... para una aplicación web, supongo que podría hacer una prueba GuiceServletContextListener por separado. Luego puede reemplazar módulos enteros con módulos para probar, o use Modules.override para anular un enlace en un módulo específico, etc.

+0

Ah, creo que estoy empezando a ver la diferencia ahora. Me encontré con otro post tuyo que arrojó luz sobre mi confusión. Básicamente, los inyectores múltiples en todo su código se asemejan más a un patrón de Localizador de servicios en lugar de a una inyección de dependencia. Todavía tengo que lidiar con esto, pero gracias por su respuesta, ya que me da un buen comienzo. –

0

Eche un vistazo al libro Dependency Injection - cubre tanto Guice como Spring, por lo que es muy fácil pasar de un marco a otro. Definitivamente bien si ya entiendes los principios detrás de IoC.

Cuestiones relacionadas