【问题标题】:Accessing external source from DAO implementation从 DAO 实现访问外部源
【发布时间】:2012-01-12 02:59:57
【问题描述】:

考虑以下简单的 DAO 示例:

public abstract class DAOFactory
{
    public abstract AccountDAO getAccountDAO();
    public abstract MessageDAO getMessageDAO();

    public static DAOFactory getDAOFactory(int whichFactory)
    {
        // depending on whichFactory
        return new SpecificDAOFactory();
    }
}

public interface AccountDAO
{
    public void add(Account account);
    public void delete(Account account);

    public int authenticate(Account account); // another source!
}

public interface MessageDAO
{
    //other methods
}

上述所有方法都必须使用相同的数据源来实现,除了 AccountDAO.authenticate()。

身份验证信息在其他数据源中可用,并且应该可以依次插入(例如,可以是 SQL、LDAP 等)。同时,鉴权数据源独立于DAO数据源,即whichFactory可以是A、B或C,而鉴权源是X或Y。

从界面设计的角度来看,身份验证非常适合 AccountDAO。但从实施的角度来看,我感到不舒服。

提供清晰的数据访问层接口和实现的更好设计是什么?

【问题讨论】:

    标签: java dao


    【解决方案1】:

    数据访问对象往往遵循相同的结构和模式,因此您可能需要考虑创建一个更高级别的类来封装此共享逻辑。我将用一个例子来强调一下,请注意我省略了接口,因为我很少发现它们在 DAO 级别有用。

    基础 DAO 类

    public class BaseDAO<T> {
        private Class<T> clazz;
    
        public BaseDAO(Class<T> clazz) {
            super();
            this.clazz = clazz;
        }
    
        public T find(Long id) { ... }
    
        public List<T> findAll() { ... }
    
        public T create(T entity) { ... }
    
        public T update(T entity) { ... }
    
        public void delete(T entity) { ... }
    }
    

    假设 Account 对象的派生 DAO

    public class AccountDAO extends BaseDAO<Account> {
        public AccountDAO() {
            super(Account.class);
        }
    
        public List<Account> findByAccountStatus(String status) { ... }
    }
    

    如您所见,您极大地减少了派生 DAO 中的代码量。使用此设置,您无需使用工厂,只需直接初始化您的 DAO。

    至于您的第二个问题,我不会在 Account DAO 上放置身份验证方法。身份验证应该在更高的抽象级别上处理(非常适合服务层),即使它最终会从数据访问层检索一些信息。

    【讨论】:

    • 同意,身份验证不应该在 DAO 中。 DAO 应该只为身份验证提供原始信息。
    猜你喜欢
    • 2017-05-23
    • 2016-05-13
    • 2012-04-27
    • 1970-01-01
    • 2016-08-02
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    相关资源
    最近更新 更多