论坛首页 Java企业应用论坛

Action + DAO 模式,可以吗

浏览 6445 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-05-28  
DAO
在审阅代码时,发现很多的Service中,啥也没做,只是在DAO层外面又封装了一层,

/**
 * @author Leon Li
 */
public interface CoreEntityManager {
    public static String ERROR_NAME_DUPLICATED = "error.name.dupliacted";
    public static String ERROR_UNKNOWN_DATABASE = "error.unknown.database";
    public static String ERROR_OBJECT_NONEXIST = "error.object.nonexist";
    
    public Class getPersistentClass();;
    
    public PersistentEntity getEntityObjectById(Class persistentClass, Serializable id);;

    public PersistentEntity loadEntityObjectById(Class persistentClass, Serializable id);;
    
    public Object getCurrentSession(); throws BBA96Exception;
    
    public Serializable save(PersistentEntity object); throws BBA96Exception;
    
    public void persist(PersistentEntity object); throws BBA96Exception;

    public void update(PersistentEntity object); throws BBA96Exception;
    
    public void refresh(PersistentEntity object); throws BBA96Exception;
    
    public void merge(PersistentEntity object); throws BBA96Exception;

    public void saveOrUpdate(PersistentEntity object); throws BBA96Exception;

    public void remove(PersistentEntity object); throws BBA96Exception;
    
    public void flush(); throws BBA96Exception;
    
    public void clear(); throws BBA96Exception;
    
    public void evict(PersistentEntity object); throws BBA96Exception;

    public void batchSave(List objects); throws BBA96Exception;

    public void batchUpdate(List objects); throws BBA96Exception;

    public void batchSaveOrUpdate(List objects); throws BBA96Exception;

    public void batchRemove(List objects); throws BBA96Exception;

    public List findByQueryObject(QueryObject queryObject, boolean cacheable, int startIndex, int maxResultCount);;
    
//  the below method only for special usage, normally find data by query object for the AOP Management
    /**
     * @deprecated
     */
    public List findByHQL(String hql, boolean cacheable, int startIndex, int maxResultCount);;
    public List findByExpQL(final String expql, final String[] names, final Object[] values, final boolean cacheable, final int startIndex, final int maxResultCount);;
    public List findBySQL(String sql, Class persistentClass, boolean cacheable, int startIndex, int maxResultCount);;
    public List findBySQL(String sql, String alias, Class persistentClass, boolean cacheable, int startIndex, int maxResultCount);;
    public int countBySQL(String sql, String alias);;
    public Object findValueBySQL(String sql, String scalar, Object type);;


}



    对于这样的增、删、改、查的操作,不包含任何的商业逻辑,看不出要扩展的必要,如果考虑到权限,也是在Action这一层来完成,与实体没有任何的关系。我觉得完全没有必要用再加上Service这一层。非常的重,代码也显的很冗余。不可以直接在Action中调用BaseDao的操作就OK了,这样程序就写的很轻便了。
    但是我在实际工作中,发现很多人都是这样写,而不用Action +DAO的方式,而我却经常这样写,所以很疑惑,难道这是反模式吗?
  
   发表时间:2006-05-29  
Robbin  自己说过,他就是DAO跟Serivce层合并的。

这个分层其实跟模式没有直接关系,主要还是架构问题。

比如你在系统中用spring的aop实现事务管理。
事务管理绑定到Service层,而不是DAO层,事务组合就少一些问题。
但是如果,你在DAO里自己做事务处理,那Service层真的没啥必要。
0 请登录后投票
   发表时间:2006-05-29  
我觉得,

单纯的说架构的优劣意义不大。

譬如系统中分几层的问题。

3层,5层都可以嘛,只是结合具体的项目的大小,复杂度来说总有一个适合这个项目的架构。

所以我觉得像lz说的这种情况

砍掉Service不是不可以。

我以前做过一个小型下载网站就是这样子的,感觉没有Service照样看起来很清晰。开发也很舒服啊。
0 请登录后投票
   发表时间:2006-05-30  
如果你的系统中还有webservice等模块的话,service还是很有必要的
0 请登录后投票
   发表时间:2006-06-02  
我很感兴趣的是对于可能抛出的BBA96Exception 你们都是怎么处理的?
0 请登录后投票
   发表时间:2006-07-08  
呵呵,上面的代码是以前写的了,现在重构过了,不过还是有DAO/Service层,参见 http://www.springside.org.cn 中bba96-tiger的jar(含原代码)的代码。

要抛出的BBA96Exception是因为某些Checked Exception,目前用到的是关于权限的Exception

仅在action控制的权限控制能力过于小,不再讨论范围内,即使是acegi,没有持久层的支持,应用范围也是有限,在复杂应用以及大数据应用肯定不能胜任。
0 请登录后投票
   发表时间:2006-09-12  
根据你项目的复杂度来看,如果你需要有复杂的业务逻辑,那么需要写在service层,如果按照你说的那样,也可以用dao+action
0 请登录后投票
   发表时间:2006-09-13  
可以不要
我也是经常要了
因为事务处理要方便一些了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics