2010-07-16 19 views
10

Sto appena iniziando a giocare con Google Guice come framework per le dipendenze e sto tentando di aggiornarlo su un progetto di piccole e medie dimensioni che ho scritto di recente. Capisco le basi di come Guice funziona, ma sono un po 'vago su alcuni dettagli di approccio. Ad esempio:Prendendo confidenza con Google Guice

1) I moduli vengono utilizzati per definire i binding, che vengono quindi inseriti negli iniettori. Tendi a mettere tutto in un unico modulo o tendi a rompere le cose in molti moduli più piccoli?

2) Si dispone di un iniettore al livello superiore che inietta l'intero albero degli oggetti o più iniettori punteggiati attorno ai quali si iniettano solo quelle dipendenze che è realmente necessario iniettare? Sto pensando qui alla mia base di codice che, ovviamente, ha molte dipendenze, ma solo una piccola parte che devo controllare durante i test.

3) Sono leggermente bloccato sul modo migliore per ottenere i miei test di sistema/integrazioni utilizzando moduli di solo ambiente di test anziché i verions di produzione. Questa domanda è probabilmente specifica per l'implementazione, ma sono curioso di sapere quali metodi usano le persone. Per riferimento, la mia app è un'app web basata su servlet.

Eventuali altri puntatori?

risposta

13

1) In genere si suddividono le cose in più moduli. Uno degli obiettivi di Guice è quello di contribuire a rendere il codice modulare, ed è a questo che servono i moduli. Dipende da te (e ovviamente non devi assolutamente farlo). Un vantaggio dei moduli a grana fine è che è possibile definire i moduli all'interno di un particolare pacchetto e rendere private le classi che implementano il pacchetto di interfacce. Poiché il modulo si trova nel pacchetto, può associare quelle classi concrete e possono essere utilizzate per configurare lo Injector (in un altro pacchetto). Inoltre, rendi il tuo codice più flessibile quando puoi cambiare il modo in cui qualcosa viene fatto cambiando semplicemente un modulo per un altro, piuttosto che dover cambiare codice in un singolo modulo monolitico.

2) Sì, un iniettore al livello più alto che inietta l'intero albero degli oggetti è il modo in cui le cose dovrebbero generalmente essere fatte. Questo torna alla cosa dei moduli ... usali per rompere le dipendenze verso i gruppi e usare un iniettore.

3) Utilizzare una classe di punto di ingresso diversa che configura l'iniettore. Per un'app standalone, avrei una diversa classe main ... per un'applicazione web, suppongo che tu possa fare un separato GuiceServletContextListener per il test. Quindi è possibile sostituire interi moduli con moduli per il test o utilizzare Modules.override per sovrascrivere un'associazione in un modulo specifico, ecc.

+0

Ah, penso che sto iniziando a vedere la differenza ora. Mi sono imbattuto in un altro post che chiarisce la mia confusione. In sostanza, più iniettori in tutto il codice sono più simili a un modello di localizzazione di servizio piuttosto che a un'iniezione di dipendenza. C'è ancora dell'altro per me, ma grazie per la tua risposta, mi dà un buon inizio. –

0

Dai uno sguardo al libro Dependency Injection - copre sia Guice che Spring, quindi è molto utile passare da una struttura all'altra. Decisamente buono se già comprendi già i principi alla base di IoC.