【问题标题】:How to call DAO without Factory?如何在没有工厂的情况下调用 DAO?
【发布时间】:2011-11-16 04:31:24
【问题描述】:

根据我的帖子here,我有以下 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 是动态的,它可能被证明是一场噩梦,试图改变工厂方法 以接受一个参数,从而破坏我的通用接口。

有没有更清洁的方法?我本可以简单地扩展 BasicDAO&lt;T, K&gt; 提供的 morphia,但这不会让我轻松地从 MongoDB 更改为 JDBC 等.

【问题讨论】:

    标签: java design-patterns mongodb dao morphia


    【解决方案1】:

    我建议你看看 Spring 或 Guice。这就是我们所说的依赖注入,因此“客户端”将不负责对其依赖项执行查找/实例化。这些容器将创建“bean”并在“客户端”对象中注入您需要的正确的一个,这样您的客户端对象就不必担心从哪里获取 DAO,或者它应该使用哪个实现。

    在 DI 世界中,为不同的实现使用不同的 bean 创建方法并没有什么坏处。这些“脏”的东西是集中的(例如,在 Spring 的情况下,在 App Context 配置中)。

    【讨论】:

    • 所以你说我的方法很好(没有工厂方法,我应该只使用Guice之类的东西,而不是定义具体的实现类在我的客户端代码中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2020-06-05
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多