2011-11-08 4 views
5

C'est la première fois que j'utilise le modèle DAO. De ce que j'ai déjà fait, l'implémentation de ce modèle m'aidera à séparer mon code appelant (contrôleur) de toute implémentation de persistance - exactement ce que je veux; c'est-à-dire que je ne veux pas être restreint à l'utilisation d'une base de données particulière ou de bibliothèques tierces.DAO et injection de dépendance, conseil?

Je crée un code de test (en mode TDD) en utilisant MongoDB et morphia (à titre d'exemple), avec la classe BasicDAO fournie par la morphia.

Pour autant que je sache, étendre BasicDAO<T, V> nécessite un constructeur qui accepte les objets Morphia et Mongo; ce sont des types très spécifiques (tiers) que je ne veux pas vraiment flotter en dehors de la classe DAO elle-même.

Comment puis-je avoir plus d'une architecture enfichable? Par ce que je veux dire, que dois-je regarder dans la possibilité de configurer mon application pour utiliser un DAO spécifique avec des arguments de configuration spécifiques, externes à la source réelle?

Répondre

9

Une couche DAO "enfichable" est généralement/toujours basée sur une interface DAO. Par exemple, laisse envisager un simple générique un:

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); 
} 

(C'est ce que vous avez dans Morphia's generic DAO)

Ensuite, vous pouvez développer différents plusieurs implémentations génériques de DAO, où vous pouvez trouver différents domaines (reflété dans paramètres constructeurs, setters et getters, etc). Supposons une base JDBC-un:

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

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

Une fois que le DAO générique est mis en œuvre (pour un datastore en béton), l'obtention d'un OAC en béton serait une évidence:

public interface PersonDAO extends GenericDAO<Person, Long> { 

} 

et

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

} 

(BTW, ce que vous avez dans Morphia's BasicDAO est une implémentation du DAO générique pour MongoDB).

La deuxième chose dans l'architecture connectable est la sélection de l'implémentation DAO concrète. Je vous conseille de lire le chapitre 2 de Apress: Pro Spring 2.5 ("Putting Spring" dans "Hello World") pour apprendre progressivement sur les usines et l'injection de dépendances

+0

+1 pour cela. J'ajouterais que Guice est le framework DI que nous sommes en utilisant avec beaucoup de succès. –

0

Quelques cadres DI standard sont Spring et Guice. Ces deux cadres facilitent TDD.

1

Le ressort fait DI pour vous en utilisant des configurations et il est largement utilisé.

1

Salut je ne suis pas un expert en java. mais en essayant de donner une solution.

vous pouvez avoir une super-classe où toutes les choses liées à la connexion se produisent et toute autre classe de base où vous pouvez l'étendre et l'utiliser.

Plus tard, tout changement dans votre base de données pour des pilotes tiers spécifiques, vous pouvez réécrire la superclasse.

Encore une fois, je ne suis pas un expert. J'essaye juste d'apprendre ici. :)