是否还应该再单设计一个DAO

07-04-11 wlmouse

我中间层打算这么设计。架构采用Spring+Hibernate。创建中间业务层的接口A。然后建立代理类B和实际的业务处理类C。B和C继承A。B是C的代理。由表现层通过B去调用C。

业务基本上都是执行HQL语句,所以还需要再建议一个Dao层吗?还是直接在C里写。如果再建立一个Dao层的话,C里基本上和B变得一样了,就是一个空空的代理,没有任何业务逻辑在里边。

         

fyxruben
2007-04-12 10:05

DAO依旧是大家提倡使用的,不过你也可以尝试下富血型模型!那就没有什么DAO了!

wlmouse
2007-04-12 10:22

不过目前我的设计还是比较偏向贫血,对象内的业务逻辑相对比较少,很多都被独立成服务了。我主要说的就是这些服务的设计。采用代理模式,一个接口A,然后代理类B和实际的业务处理类C继承接口A。调用的时候通过B调用C。现在就是业务上看了看,主要就是增删改查,在C里直接写HQL就可以了,逻辑业务可以说也就是这些。我觉得既然Hibernate把数据库和业务隔离了,再来一个Dao层来隔离Hibernate是否多此一举?因为业务逻辑就是HQL,如果再添一个层,类C就变得和类B差不多了,都只是一个代理了。等于我就是加了一层代理。所以我觉得没什么必要了。

fyxruben
2007-04-12 11:19

个人觉得javaeye上面对这方面的讨论很多,而且对Hibernate的封装设计也很多!有空你可以去看看!

如果你不想被侵入,用用DAO还是不错的!

个人还没有学习Hibernate,如果学,打算学习JPA!

cscs31
2007-04-12 15:09

个人认为,你现在的结构是这样的,代理层(B)、业务层(C)、数据层等等吧,你的问题是是否要在C后加一个DAO层,我认为还是有用的。

原因:你可以这么想,现在你的业务层中是一些简单的逻辑(CRUD),其实就是直接调用hibernate的方法,那么咱们来写一段程序看看。

接口: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,然后通过配置文件配置,这样服务层的代码不用更改。

如果技术进步,业务层需要重写,这时候那些访问数据的代码也不用重写了。

不知道说的对不对,希望大家讨论。

还有就是,代理层到底有什么用?是和分布式有关系吗?

2Go 1 2 下一页