DAO和dependency injection,建议?

这是我第一次使用DAO模式。 从我到目前为止所读到的 ,实现这种模式将帮助我从任何持久性实现中分离我的调用代码(控制器) – 正是我想要的; 也就是说,我不想被重新使用任何特定的数据库或第三方库。

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

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

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

“可插拔”DAO层通常/总是基于接口DAO。 例如,让我们考虑一个非常通用的简单方法:

 public interface GenericDAO  { List getAll(Class typeClass); T findByKey(Class typeClass, K id); void update(T object); void remove(T object); void insert(T object); } 

(这就是你在Morphia的通用DAO中所拥有的 )

然后,您可以开发不同的几个通用DAO实现,您可以在其中找到不同的字段(反映在构造函数参数,setter和getter等)。 我们假设一个基于JDBC的:

 public class GenericDAOJDBCImpl implements GenericDAO { private String db_url; private Connection; private PreparedStatement insert; // etc. } 

一旦实现了通用DAO(对于具体的数据存储区),获得具体的DAO将是一个明智的选择:

 public interface PersonDAO extends GenericDAO { } 

 public class PersonDAOJDBCImpl extends GenericDAOJDBCImpl implements PersonDAO { } 

(顺便说一句,你在Morphia的BasicDAO中所拥有的是MongoDB的通用DAO的实现)。

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

Spring使用配置为您做DI,并且它被广泛使用。

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

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

稍后您的数据库中的任何开关都可以重写特定的第三方驱动程序。

我再也不是专家。 试着在这里学习。 🙂

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