2009-02-10 42 views
16

依賴注入是否意味着你不需要'new'關鍵字?或者是否有理由直接創建簡單的葉類,如集合?在使用依賴注入時,有沒有'新'的情況?

在下面我的例子中注入比較,查詢和DAO,但SortedSet的直接實例:

public Iterable<Employee> getRecentHires() 
{ 
    SortedSet<Employee> entries = new TreeSet<Employee>(comparator); 
    entries.addAll(employeeDao.findAll(query)); 
    return entries; 
} 

回答

9

只是因爲依賴注入是一個有用的模式並不意味着我們使用它的一切。即使在使用DI時,通常也需要新的。不要刪除新的。

0

是的,當然。

依賴注入意味着可能有幾個可能的實例化目標,其中客戶端可能不知道(或能夠做出選擇)的編譯時間。

但是,有足夠的情況下確實知道要實例化的內容,因此不需要DI。

這就像在面向對象的語言中調用函數一樣:只是因爲你可以使用動態綁定,並不意味着你不能使用良好的舊靜態分派(例如,當你的方法分成幾個私有操作)。

4

使用與您的代碼片段中顯示的一樣沒有任何問題。

考慮想要追加字符串片段的情況。爲什麼你想要問一個StringBuilder的注入器?

在我面對的另一種情況下,我需要根據容器的生命週期運行一個線程。在這種情況下,我必須執行新線程(),因爲我的Injector是在調用容器啓動的回調方法之後創建的。一旦注入器準備好了,我就會手動注入一些託管類到我的Thread子類中。

6

我通常決定是否使用依賴注入的一種方式是在編寫測​​試類的單元測試時是否需要模擬或者刪除協作類。例如,在你的例子中,你正確地注入了DAO,因爲如果你爲你的類寫了一個單元測試,你可能不希望任何數據被真正寫入數據庫。或者也許是一個協作類將文件寫入文件系統或依賴於外部資源。或者單元測試中的行爲是不可預測或難以解釋的。在這些情況下,最好注入這些依賴關係。

對於像TreeSet這樣的協作類,我通常不會注入這些類,因爲通常不需要模擬這些簡單的類。

最後一個注意事項:當某個字段無論何種原因無法注入時,但我仍然想在測試中嘲笑它,我發現Junit-addons PrivateAccessor類有助於將該類的專用字段切換爲模擬由EasyMock創建的對象(或者jMock或其他任何你喜歡的模擬框架)。

+0

Spring還擁有用於私有成員操作的`ReflectionTestUtils`類。 – 2013-05-21 09:19:23

0

我的想法是,DI是非常棒的,非常適合連線層,而且您的代碼片段也需要靈活應對潛在的變化。當然,我們可以說一切都可能需要改變,但我們都知道在實踐中有些東西不會被觸及。

所以當DI過度殺傷我使用'新',只是讓它滾動。例如:對於我將模型連接到視圖到控制器層,它總是通過DI來完成的。我的應用使用的任何算法,DI以及任何可插入反射代碼DI。數據庫層.. DI,但幾乎任何其他在我的系統中使用的對象都是用一個通用的'new'來處理的。

希望這有助於。

0

確實,在當今,框架驅動的環境中,您實例化對象的次數越來越少。例如,Servlet通過servlet容器實例化,Spring中的bean實例化爲Spring等。

儘管如此,當使用持久層時,您將在持久化對象被實例化之前對其進行實例化。例如,在使用Hibernate時,在調用HibernateTemplate上的保存之前,您將在持久化對象上調用new。

相關問題