Board logo

标题: [讨论] 与springside的同学们讨论一下dao层和接口 [打印本页]

作者: bigbusyboy    时间: 2008-2-21 18:05     标题: 与springside的同学们讨论一下dao层和接口

我看了一下ss3的最新代码,对于dao的设计有点想法。

首先,我比较欣赏的是在ss中没有出现接口的滥用,但看到ss3中dao层没有面向接口还是吃了一惊。我觉得这个和解耦有关;泛型dao我第一次看到是在gavin king的书上,16章。里面仍然倡议在dao面向接口编程,容易轻易替换hibernate的实现。甚至每个特定子dao他都定义了接口继承了GenericDAO并单独Hibernate实现。我开始想他是不是把service给省略了,后来发现如果业务复杂的话,在web controller调用之前给dao层上直接包装一层service层是可以而且必须的。这里有javaeye上的讨论。
ss3中皈依了JPA,这样也许接口可以省略了?

其次,如果解耦依赖于service即依赖注入到manager的dao的实现不同的话,可否简化到根本就没有子dao的存在?
除了基本的CRUD和少量公共操作外,大量的业务逻辑我觉得应该由manager来完成(当然,不排除在model中有少量逻辑方法,但不涉及持久化),所以我觉得dao层既然不承担解耦作用了,干脆连具体的子类也免去得了。做法就是在GenericDAO中定义了protected Class<T> entityClass,那么我们直接在配置文件中将具体的entityClass注入到GenericDAO中,就拥有了一个可用的子dao,然后把此子dao注入到manager中就可以了。
<bean id="userDao" class="org.springside.modules.orm.jpa.GenericDAO">
<constructor-arg>
<value>org.springside.examples.miniweb.entity.user.User</value>
</constructor-arg>
</bean>
<bean id="userManager" class="org.springside.examples.miniweb.service.user.UserManager" />
至少这么做在manager中是透明的。换句话说,在UserDAO中的业务逻辑交给manager去做,我们不需要特定的DAO了。

谢谢阅读,欢迎讨论。
[ 本帖最后由 bigbusyboy 于 2008-2-21 18:07 编辑 ]




欢迎光临 SpringSide中文论坛 (http://forum.springside.org.cn/) Powered by Discuz! 5.0.0