2012-01-12 182 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