我正在考虑使用依赖注入实现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
更改为类似:
UserHibernateDaoImpl
或UserMongoDBDaoImpl
或保存到任何数据库的任何实现。
仍然保持UI / Client中的代码完好无损,例如:
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
Dao dao = (Dao) ctx.getBean("userDao");
dao.put(something);
我需要立即执行此操作的一个原因,我需要使用app引擎(通过objectify)开发,但是将来我可能需要将一些数据访问对象更改为hibernate,一些更改为mongodb(因此它是混合) 。
我还没有测试过这段代码,这个策略会起作用吗?
答案 0 :(得分:1)
是的,这会有效。实际上,这是发明DI和编码接口的主要原因之一。只需确保所有DAO实现遵循相同的合同(DAO经常引入leaky abstractions)。
此外,您还有其他几个选项可以实现相同的目标:
多个@Service
个带注释的类,其中一个标记为@Primary
(如果您使用自动装配)
Spring profiles并选择性激活bean
顺便说一句,如果您正在考虑切换到其他DAO实施,请查看CrudRepository
中的Spring Data。 Spring Data项目提供了几个为MongoDB,Neo4J,JPA等实现此接口的模块。
暂时似乎有几个Spring Data模块不能很好地协同工作(请参阅:DATAJPA-146),因此如果您选择实施CrudRepository
,请确保此问题已得到修复或您可以正常工作它周围。感谢@iddqd指出了这一点。
答案 1 :(得分:0)
如果在应用程序中只需要一个实现,但是如果在应用程序中需要多个实现(混合模式),则可以将上下文配置更改为选定的Dao实现,您需要设计工厂层。您尝试设计一个名为Factory的图层及其API和实现,并决定随时选择女巫Dao(Hibernate,MongoDB,JP等)。