2012-01-12 112 views
0

考虑下面的简单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

数据访问对象倾向于遵循相同的结构和模式,因此您可能需要考虑创建封装此共享逻辑的更高级别的类。我将通过一个例子强调一下,请注意我省略了接口,因为我很少在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一个假设Account对象

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

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

正如你所看到的,你大大减少在导出的DAO的代码量。使用此设置,您无需使用工厂,只需直接初始化您的DAO即可。

至于第二个问题,我不会在帐户DAO上放置验证方法。认证应该在较高的抽象层次上进行处理(即使它最终从数据访问层中检索到某些信息)。

+0

同意,身份验证不应该在DAO中。 DAO应该只提供认证的原始信息。 – Rustam 2012-01-26 14:58:25