Как позвонить в DAO без Фабрики? - PullRequest
1 голос
/ 16 ноября 2011

Согласно моему посту здесь , у меня есть следующая иерархия DAO:

GenericDAO.java

public interface GenericDAO<T, K> {
    public K insert(T object);
    public void remove(K objectId);
    // extensible
}

GenericDAOMongoDBImpl.java

public class GenericDAOMongoDBImpl<T, K> extends BasicDAO<T, K> implements GenericDAO<T, K> {
    public GenericDAOMongoDBImpl(Class<T> entityClass, Mongo mongo, Morphia morphia, String dbName) {
        super(entityClass, mongo, morphia, dbName);
    }

    public K insert(T object) {
        // TODO Auto-generated method stub
        return null;
    }

    public void remove(K objectId) {
        // TODO Auto-generated method stub
    }
}

ObjectDAO.java

public interface ObjectDAO extends GenericDAO<Object, ObjectId> {
}

ObjectDAOMongoDBImpl.java

public class ObjectDAOMongoDBImpl extends GenericDAOMongoDBImpl<Object, ObjectId> implements ObjectDAO {
    public ObjectDAOMongoDBImpl(Class<Object> entityClass, Mongo mongo, Morphia morphia, String dbName) {
        super(entityClass, mongo, morphia, dbName);
    }
}

Я не понимаю, как мне следует использовать ObjectDAO? На данный момент, я думаю, что фабричный метод является излишним. Поэтому вместо этого имеет смысл просто создать DAO из клиента следующим образом:

ObjectDAOMongoDBImpl objectDAO = new ObjectDAOMongoDBImpl(clazz, mongo, morphia, dbName);

Поскольку clazz является динамическим, он мог оказаться кошмаром, пытаясь изменить фабричный метод , чтобы принять аргумент, нарушая мой общий интерфейс на этом пути.

Есть ли более чистый путь? Я мог бы просто расширить morphia при условии BasicDAO<T, K>, но это не позволило бы мне легко перейти с MongoDB на JDBC и т. Д.

1 Ответ

2 голосов
/ 16 ноября 2011

Я предлагаю вам взглянуть на Весну или Guice.Это то, что мы назвали Dependency Injection, так что «клиент» не будет нести ответственность за поиск / создание экземпляров для своих зависимостей.Эти контейнеры создадут «bean-компоненты» и добавят нужный вам в ваш «клиентский» объект, чтобы вашему клиентскому объекту не нужно было беспокоиться о том, где получить DAO или какую реализацию он должен использовать.1002 * И в мире DI просто не вредно иметь разные методы создания bean-компонентов для разных реализаций.Эти "грязные" вещи централизованы (например, в конфигурации контекста приложения в случае Spring).

...