2011-11-08 69 views
5

這是我第一次使用DAO模式。從我到目前爲止的read開始,實現這個模式將幫助我從任何持久化實現中分離我的調用代碼(控制器) - 正是我想要的;也就是說,我不希望被禁止使用任何特定的數據庫或第三方庫。DAO和依賴注入,建議?

我創建一些測試代碼(在TDD方式)使用的MongoDB和嗎啡(作爲一個例子),與嗎啡的提供BasicDAO類。

據我所知,擴展BasicDAO<T, V>需要一個接受Morphia和Mongo對象的構造函數;這些都是非常具體的(第三方)類型,我並不想在DAO類本身之外浮動。

我怎樣纔能有更多的可插拔架構?通過這個我的意思是,我應該看看能夠配置我的應用程序使用特定配置參數的特定DAO,實際源外部?

回答

9

「可插拔」DAO層通常/總是基於接口DAO。例如,讓我們考慮一個相當普通簡單:

public interface GenericDAO <T, K extends Serializable> { 
    List<T> getAll(Class<T> typeClass); 
    T findByKey(Class<T> typeClass, K id); 
    void update(T object); 
    void remove(T object); 
    void insert(T object); 
} 

(這是你在Morphia's generic DAO

然後你就可以制定不同的幾個通用的DAO實現,在這裏你可以找到不同領域(反映在構造函數參數,setter和getters等)。讓我們假設一個基於JDBC的一個:

public class GenericDAOJDBCImpl<T, K extends Serializable> implements GenericDAO<T, K extends Serializable> { 
    private String db_url; 

    private Connection; 
    private PreparedStatement insert; 
    // etc. 
} 

一旦通用的DAO實現(對於一個具體的數據存儲),得到一個具體的DAO是沒有道理的:

public interface PersonDAO extends GenericDAO<Person, Long> { 

} 

public class PersonDAOJDBCImpl extends GenericDAOJDBCImpl<Person, Long> implements PersonDAO { 

} 

(順便說一句,你在Morphia's BasicDAO中有什麼是MongoDB的通用DAO的實現)。

可插入架構中的第二件事是選擇具體的DAO實現。我建議你閱讀Apress: Pro Spring 2.5(「把Spring放入」Hello World「)中的第2章,以逐步瞭解工廠和依賴注入的知識。

+0

+1這個我會補充說Guice是我們的DI框架使用很好的成功。 –

0

幾個標準的DI框架是Spring和Guice。這兩個框架都有助於TDD。

1

Spring會爲您使用配置並且它被廣泛使用。

1

嗨,我不是java的專家。但試圖給出一個解決方案。

您可以擁有所有與連接有關的東西發生的超類,以及可以擴展和使用它的任何其他基類。

後來在您的數據庫中的任何開關特定的第三方驅動程序,你可以重寫超類。

我再次不是專家。試着在這裏學習。 :)