2011-11-08 8 views
5

Questa è la prima volta che im utilizzando il modello DAO. Da quello che ho finora, read, l'implementazione di questo modello mi aiuterà a separare il mio codice di chiamata (controller) da qualsiasi implementazione di persistenza, esattamente ciò che voglio; cioè, non voglio essere riregistrato all'uso di un particolare database o di librerie di terze parti.Iniezione DAO e dipendenza, consigli?

Sto creando un codice di test (in modalità TDD) usando MongoDB e morfina (ad esempio), con la classe BasicDAO fornita da morfina.

Per quanto posso dire, l'estensione di BasicDAO<T, V> richiede un costruttore che accetta gli oggetti Morphia e Mongo; questi sono tipi molto specifici (di terze parti) che non desidero realmente fluttuare al di fuori della stessa classe DAO.

Come posso avere più di un'architettura collegabile? Con questo voglio dire, che cosa dovrei cercare di essere in grado di configurare la mia applicazione per utilizzare uno specifico DAO con specifici argomenti di configurazione, esterni alla sorgente effettiva?

risposta

9

Uno strato DAO "collegabile" è in genere/sempre basato su un'interfaccia DAO. Per esempio, consente di prendere in considerazione un semplice abbastanza generica uno:

public interface GenericDAO <T, K extends Serializable> { 
    List<T> getAll(Class<T> typeClass); 
    T findByKey(Class<T> typeClass, K id); 
    void update(T object); 
    void remove(T object); 
    void insert(T object); 
} 

(questo è quello che hai in Morphia's generic DAO)

Quindi è possibile sviluppare diverse diverse implementazioni DAO generici, dove si possono trovare diversi campi (in base parametri del costruttore, setter e getter, ecc.). Supponiamo che un JDBC-based uno:

public class GenericDAOJDBCImpl<T, K extends Serializable> implements GenericDAO<T, K extends Serializable> { 
    private String db_url; 

    private Connection; 
    private PreparedStatement insert; 
    // etc. 
} 

Una volta che il DAO generico è implementato (per un datastore calcestruzzo), ottenendo un DAO concreto sarebbe una bazzecola:

public interface PersonDAO extends GenericDAO<Person, Long> { 

} 

e

public class PersonDAOJDBCImpl extends GenericDAOJDBCImpl<Person, Long> implements PersonDAO { 

} 

(A proposito, ciò che si ha in Morphia's BasicDAO è un'implementazione del DAO generico per MongoDB).

La seconda cosa nell'architettura collegabile è la selezione dell'attuazione DAO concreta. Ti consiglio di leggere il capitolo 2 da Apress: Pro Spring 2.5 ("Mettere Spring in" Hello World ") per conoscere progressivamente le fabbriche e l'iniezione delle dipendenze

+0

+1 per questo. Aggiungo che Guice è il framework DI che siamo usando con grande successo. –

0

Un paio di quadri DI standard sono Spring e Guice. Entrambi questi framework facilitano il TDD.

1

Spring fa DI per voi utilizzando le configurazioni ed è ampiamente utilizzato.

1

Ciao io non sono un esperto di java. ma cercando di dare una soluzione.

si può avere una superclasse in cui si verificano tutte le cose relative alla connessione e qualsiasi altra classe base in cui è possibile estenderla e utilizzarla.

In seguito a qualsiasi passaggio nel DB per specifici driver di terze parti è possibile riscrivere la superclasse.

Ancora una volta non sono esperto. Sto solo provando da queste parti per imparare. :)