是否还应该再单设计一个DAO
业务基本上都是执行HQL语句,所以还需要再建议一个Dao层吗?还是直接在C里写。如果再建立一个Dao层的话,C里基本上和B变得一样了,就是一个空空的代理,没有任何业务逻辑在里边。
接口:Login(String userName,String passWord) throw YourException;
delegate:
public Login(String userName,String passWord) throw YourException
{
UserService us = ServiceFactory.getService("User");
us.Login(String userName,String passWord);
}
service:
public Login(String userName,String passWord) throw YourException
{
try{
//hibernate实现
}catch(Exception e){
YourException ye = new YourException(e);
throw ye;
}
}
如果这个时候,你的C层要更改持久层实现技术,比如使用ejb,jdbc
这个时候考虑问题的时候,其实业务逻辑并没有变,只是访问的方法变了。
可是现在的架构必须去更改service层的代码。
或者在今后的技术进步中,service层出现别的技术,那么你又要重写数据访问的代码,如果改成下面这样:
service层:
public Login(String userName,String passWord) throw YourException
{
try{
UserDAO = DAOFactory.getDAO("User");//通过配置文件
User user = UserDAO.getUserByUserName(String userName);
if(isExist(user))
{
checkpassword(user);
//添加业务逻辑
checkActive(user);
}
}catch(Exception e){
YourException ye = new YourException(e);
throw ye;
}
}
DAO:
interface: User getUserByUserName(String userName) throw DBException;
implement:
UserDAOImplHibernate
User getUserByUserName(String userName) throw DBException;
如果使用别的实现方法,可以重新添加一个UserDAOImplEjb,然后通过配置文件配置,这样服务层的代码不用更改。
如果技术进步,业务层需要重写,这时候那些访问数据的代码也不用重写了。
不知道说的对不对,希望大家讨论。
还有就是,代理层到底有什么用?是和分布式有关系吗?
贫血和充血模型:
http://www.jdon.com/jivejdon/thread/31369.html
Dao属于Evans DDD的Respository 仓储:
http://www.jdon.com/mda/ddd.html
[该贴被banq于2007年04月13日 10:54修改过]