【问题标题】:DAO and dependency injection, advice?DAO 和依赖注入,建议?
【发布时间】:2023-11-16 16:50:01
【问题描述】:

这是我第一次使用 DAO 模式。从我目前的read 来看,实现这个模式将帮助我将我的调用代码(控制器)与任何持久性实现分开——这正是我想要的;也就是说,我不想被限制使用任何特定的数据库或第 3 方库。

我正在使用 MongoDB 和 morphia(作为示例)创建一些测试代码(以 TDD 方式),其中 morphia 提供了 BasicDAO 类。

据我所知,扩展 BasicDAO<T, V> 需要一个接受 Morphia 和 Mongo 对象的构造函数;这些是非常具体的(第 3 方)类型,我真的不想在 DAO 类本身之外四处游荡。

我怎样才能拥有更多的可插拔架构?我的意思是,我应该如何重新配置​​我的应用程序以使用具有特定配置参数的特定 DAO,在实际源之外?

【问题讨论】:

    标签: java design-patterns mongodb dao morphia


    【解决方案1】:

    “可插拔”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);  
    }
    

    (这是您在Morphia's generic DAO 中的内容)

    然后您可以开发不同的几种通用 DAO 实现,您可以在其中找到不同的字段(体现在构造函数参数、setter 和 getter 等)。让我们假设一个基于 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's BasicDAO 中的内容是 MongoDB 的通用 DAO 的实现)。

    可插拔架构中的第二件事是选择具体的 DAO 实现。我建议您阅读 Apress: Pro Spring 2.5 的第 2 章(“将 Spring 放入“Hello World”),以逐步了解工厂和依赖注入。

    【讨论】:

    • 为此 +1。我要补充一点,Guice 是我们使用的 DI 框架并取得了巨大的成功。
    【解决方案2】:

    Spring 使用配置为您进行 DI,并且被广泛使用。

    【讨论】:

      【解决方案3】:

      您好,我不是 java 专家。但试图给出一个解决方案。

      你可以有一个超类,所有与连接相关的东西都发生在这个超类中,你可以拥有一个可以扩展和使用它的任何其他基类。

      稍后在您的数据库中为特定的第 3 方驱动程序进行任何切换,您都可以重写超类。

      再说一遍,我不是专家。只是想在这里学习。 :)

      【讨论】:

        【解决方案4】:

        几个标准的 DI 框架是 Spring 和 Guice。这两个框架都有助于 TDD。

        【讨论】: