[英]DAO and dependency injection, advice?
這是我第一次使用DAO模式。 從我到目前為止所讀到的 ,實現這種模式將幫助我從任何持久性實現中分離我的調用代碼(控制器) - 正是我想要的; 也就是說,我不想被重新使用任何特定的數據庫或第三方庫。
我正在使用MongoDB和morphia(作為示例)創建一些測試代碼(以TDD方式),並使用morphia提供的BasicDAO
類。
據我所知,擴展BasicDAO<T, V>
需要一個接受Morphia和Mongo對象的構造函數; 這些是非常具體的(第三方)類型,我真的不想在DAO類本身之外浮動。
我怎樣才能擁有更多可插拔架構? 我的意思是,我應該考慮如何配置我的應用程序以使用具有特定配置參數的特定DAO,在實際源外部?
“可插拔”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的通用DAO中所擁有的 )
然后,您可以開發不同的幾個通用DAO實現,您可以在其中找到不同的字段(反映在構造函數參數,setter和getter等)。 我們假設一個基於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的BasicDAO中所擁有的是MongoDB的通用DAO的實現)。
可插拔架構中的第二件事是選擇具體的DAO實現。 我建議你閱讀Apress的第2章:Pro Spring 2.5 (“將春天放入”Hello World“)以逐步了解工廠和依賴注入。
Spring使用配置為您做DI,並且它被廣泛使用。
嗨,我不是java的專家。 但試圖給出一個解決方案。
你可以有一個超類,其中發生所有連接相關的東西,以及你可以擴展和使用它的任何其他基類。
之后,您的數據庫中的任何開關都可以為特定的第三方驅動程序重寫超類。
我再也不是專家。 試着在這里學習。 :)
一對標准的DI框架是Spring和Guice。 這兩個框架都有助於TDD。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.