从DAO实现访问外部源

时间:2012-01-12 02:59:57

标签: java dao

请考虑以下简单的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数据源,即哪个工厂可以是A,B或C,而认证源X或Y.

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

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

1 个答案:

答案 0 :(得分: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) { ... }
}

假设帐户对象的派生DAO

public class AccountDAO extends BaseDAO<Account> {
    public AccountDAO() {
        super(Account.class);
    }

    public List<Account> findByAccountStatus(String status) { ... }
}

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

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