0

我正在考虑使用依赖注入实现 Objectify DAO,这样我就可以维护我的代码以访问相同的“Dao”,而将来实现可能会从 Objectify 更改为 Hibernate-MySQL 或 MongoDb,而无需担心更改任何代码UI 或客户端。

UserDao 基于此处的示例:http: //turbomanage.wordpress.com/2010/01/28/simplify-with-objectify/

UserObjectifyDaoImpl implements Dao<User> {

 private UserDao dao = null; 

 public void put(User entity) {
    if (dao == null) {
       dao = new UserDao(); 
    }
    dao.put(entity);
 }
 // other put and set methods
}

这样,我有context.xml

<bean id="userDao" class="com.example.server.daoimpl.UserObjectifyDaoImpl">
    <property name="dataSource" ref="dataSource"/>
</bean>

如果我需要更改实现,我只需要将这个 bean 从更改UserObjectifyDaoImpl为:

UserHibernateDaoImplUserMongoDBDaoImpl或任何实现保存到任何数据库。

并且我的 UI / 客户端中的代码仍然完好无损,例如:

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());

Dao dao = (Dao) ctx.getBean("userDao");
dao.put(something);

我现在需要这样做的一个原因是,我需要使用应用程序引擎(通过 objectify)进行开发,但是将来我可能需要将一些数据访问对象更改为 hibernate,一些更改为 mongodb(所以它是混合的)。

我还没有测试过这段代码,这个策略会起作用吗?

4

2 回答 2

1

是的,这会起作用。事实上,这是发明 DI 和接口编码的主要原因之一。只需确保所有 DAO 实现都遵循相同的合同(DAO 经常引入泄漏抽象)。

此外,您还有其他几个选项可以实现相同的目标:

  • 几个@Service带注释的类,其中一个标记为@Primary(如果您使用自动装配)

  • Spring配置文件和bean的选择性激活

CrudRepository顺便说一句,如果您正在考虑切换到不同的 DAO 实现,请查看Spring Data。Spring Data 项目为 MongoDB、Neo4J、JPA 等提供了几个实现该接口的模块。

目前,似乎几个 Spring Data 模块不能很好地协同工作(请参阅:DATAJPA-146),因此如果您选择实施,请CrudRepository确保此问题已得到修复,或者您可以解决此问题。感谢@iddqd指出这一点。

于 2012-02-09T12:09:54.453 回答
0

如果您在应用程序中只需要一个实现,但如果您在应用程序中需要多个实现(混合模式),您可以将上下文配置更改为选定的 Dao 实现,您需要设计工厂层。您尝试设计一个名称为 Factory 及其 API 和实现的层,它决定在任何时候都必须选择女巫 Dao(Hibernate、MongoDB、JP 等)。

于 2012-02-09T12:21:09.167 回答