DAO и внедрение зависимостей, совет? - PullRequest
5 голосов
/ 08 ноября 2011

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

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

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

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

Ответы [ 4 ]

9 голосов
/ 08 ноября 2011

«Подключаемый» уровень 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 {

}

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

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

1 голос
/ 08 ноября 2011

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

1 голос
/ 08 ноября 2011

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

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

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

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

0 голосов
/ 08 ноября 2011

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

...