2009-06-24 15 views
7

mi sono appena armeggiato con Google Guice per Iniezione di dipendenza e ho iniziato ad integrarlo nella mia applicazione esistente. Fin qui tutto bene. Ho molte classi che hanno bisogno, oltre alle loro dipendenze, di Stringhe, DataSource, eccetera. So che ci sono NamedBindings, ma in realtà non voglio creare un'annotazione per ogni semplice stringa che devo passare al costruttore per ogni classe. Quindi, c'è una cosa chiamata AssistedInject, che crea implementazioni Factory per me. Wow, ma devo ancora definire l'interfaccia della fabbrica. Thats bene per le classi che si dispone di dipendenze, ma per quanto riguarda questo esempio di classe:Iniezione di dipendenza con Guice: qualcosa che non è coperto da alcun tutorial

public class FooBarClass { 
    public FooBarClass(String name, String anotherOne) { 
     // Some stuff 
    } 
} 

Ci sono casi in cui sono in dubbio come utilizzare Guice o, più in generale, DELLA strada giusta. "Spesso sento: XYZ Framework è il nuovo new." Ma questo implicito che devo creare ogni istanza con il framework DI.

sola istanza è richiesta

Che cosa succede se ho bisogno di una sola istanza di questa classe? Questa classe non ha assolutamente dipendenze accanto a due stringhe. Pensa a un gancio di arresto che verrà instanciato una sola volta e passato alla JVM come mio gancio di arresto. Dovrei creare questa istanza con Guice? Mi sembra molto stupido, perché non c'è niente da iniettare, ma devo scrivere un'interfaccia factory per passare Guide entrambi i parametri e devo creare un'interfaccia per il mio FooBarClass per usare DI.

Più istanze sono tenuti

La stessa cosa vale per un caso in cui ho bisogno di più istanze di questa classe. Nessuna dipendenza, ma devo creare un po 'di codice boilerplate per non farci nulla. Questo mi sembra sbagliato.

Quindi, come dovrei usare DI e/o Guice?

Grazie mille!

risposta

23

Potrebbe essere utile dividere le dipendenze da dati.

  • Le dipendenze sono spesso servizi: database, orologi e stub RPC. Inoltre, tutti i codici dell'applicazione sono sovrapposti a questi: UserAuthenticator, PaymentHandler e EmailGateway.
  • I dati sono proprio questo: uno Date, uno Map<String,InetAddress> o addirittura uno Customer. Questi sono semplici oggetti di dominio in memoria.

DI è naturalmente più adatto per il lato di dipendenza delle cose. Dovresti continuare a utilizzare new per le tue classi di modelli di dati.

2

se si creano istanze multiple come singoli clienti, non ha senso iniettarle. ciò che ha senso è creare un CustomerFactory che può essere l'ambito @Singleton che può creare istanze di Cliente con tutte le sue dipendenze.

2

Iniettare una dipendenza se si desidera ignorare (isolare) la sua complessità durante il test di una particolare classe. Se la classe è solo un titolare di dati, il suo codice è banale (get, set, equals). Non è necessario prenderlo in giro durante il test della classe di destinazione, quindi l'iniezione dell'istanza di dati è eccessiva (e solitamente difficile).Se il codice non è banale, la classe è più di un titolare di dati e dovresti iniettarla e deriderla sui test unitari.