没有Factory如何调用DAO?

发布于 2024-12-15 15:58:45 字数 1765 浏览 2 评论 0原文

根据我的帖子此处,我有以下 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,但这不允许我轻松地从 MongoDB 更改为JDBC

As per my post here, I have the following DAO hierarchy:

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

I'm confused on how I should go about using ObjectDAO? At this point in time, I think a factory method is overkill. So instead, it makes more sense to simply construct the DAO from the client like so:

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

As clazz is dynamic, it might have proven a nightmare trying to alter the factory method to accept an argument, breaking my generic interface along the way.

Is there a cleaner way? I could have simply extended the morphia provided BasicDAO<T, K>, but this wouldn't have allowed me to easily change from MongoDB to JDBC, etc.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

合久必婚 2024-12-22 15:58:45

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

在 DI 世界中,为不同的实现提供不同的 Bean 创建方法并没有什么坏处。这些“脏”的东西是集中的(例如在 Spring 的应用程序上下文配置中)。

I will suggest you to look at Spring or Guice. That's what we called Dependency Injection, so that "client" will not be responsible to perform lookup/instantiation for their dependencies. These container will create the "beans" and inject the correct one you need in your "client" object, so that your client object do not need to worry about where to get the DAO, or which implementation it should use.

And in a DI world, it just doesn't harm to have different creation method for beans for different implementation. These "dirty" things are centralized (e.g. in App Context config in case of Spring).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文