DAO и внедрение зависимостей, совет?

Я впервые использую шаблон DAO. Из того, что я прочитал, мне поможет отделить мой вызывающий код (контроллер) от любой реализации постоянства - именно то, что я хочу; то есть я не хочу, чтобы меня ограничивали использованием какой-либо конкретной базы данных или сторонних библиотек.

Я создаю тестовый код (в стиле TDD), используя MongoDB и morphia (в качестве примера), с предоставленным классом BasicDAO morphia.

Насколько я могу судить, для расширения BasicDAO<T, V> требуется конструктор, принимающий объекты Morphia и Mongo; это очень специфические (сторонние) типы, которые мне действительно не нужны, вне самого класса DAO.

Как я могу получить больше подключаемой архитектуры? Под этим я подразумеваю, что мне следует изучить, чтобы настроить мое приложение для использования определенного DAO с конкретными аргументами конфигурации, внешними по отношению к фактическому источнику?


person wulfgarpro    schedule 08.11.2011    source источник


Ответы (4)


«Подключаемый» уровень DAO обычно / всегда основан на интерфейсе DAO. Например, давайте рассмотрим довольно общий простой:

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

(Это то, что у вас есть в общий DAO Morphia)

Затем вы можете разработать несколько различных общих реализаций DAO, где вы можете найти разные поля (отраженные в параметрах конструктора, установщиках и геттерах и т. Д.). Предположим, что на основе JDBC:

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

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

После того, как общий DAO будет реализован (для конкретного хранилища данных), получить конкретный DAO будет несложно:

public interface PersonDAO extends GenericDAO<Person, Long> {

}

а также

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

}

(Кстати, что у вас есть в Morphia BasicDAO - это реализация универсального DAO для MongoDB).

Вторая вещь в подключаемой архитектуре - это выбор конкретной реализации DAO. Я бы посоветовал вам прочитать главу 2 из Apress: Pro Spring 2.5 («Помещение Spring в« Hello World »), чтобы постепенно узнавать о фабриках и внедрении зависимостей.

person jalopaba    schedule 08.11.2011
comment
+1 за это. Я бы добавил, что Guice - это фреймворк DI, который мы используем с большим успехом. - person Remon van Vliet; 08.11.2011

Spring делает за вас DI, используя конфигурации, и он широко используется.

person Naresh M    schedule 08.11.2011

Привет, я не эксперт в Java. но пытаюсь дать решение.

у вас может быть суперкласс, в котором происходят все вещи, связанные с подключением, и любой другой базовый класс, в котором вы можете его расширять и использовать.

Позже любой переключатель в вашей БД для конкретных сторонних драйверов вы можете переписать суперкласс.

Опять же, я не эксперт. Просто пытаюсь здесь учиться. :)

person Punith Raj    schedule 08.11.2011

Пара стандартных структур DI - это Spring и Guice. Обе эти структуры облегчают TDD.

person John B    schedule 08.11.2011