2009-06-24 62 views
7

我只是用Google Guice進行依賴注入,並開始將它集成到我現有的應用程序中。到現在爲止還挺好。除了它們的依賴關係之外,我還有很多類需要Strings,DataSources等等。我知道有NamedBindings,但我真的不想爲每個簡單的字符串創建一個註釋,我必須傳遞給每個類的構造函數。然後,有一個名爲AssistedInject的事情,爲我創建Factory實現。哇,但我仍然必須定義工廠的界面。那好了這個例子類,它確實有依賴的類,但什麼:Guice的依賴注入:沒有被任何教程覆蓋的東西

public class FooBarClass { 
    public FooBarClass(String name, String anotherOne) { 
     // Some stuff 
    } 
} 

有我的疑問如何使用吉斯,或者更一般地說,DI正道案件。 「我經常聽到:XYZ Framework是新的新的。」但這暗示我必須創建每個實例與DI框架。

只有一個實例需要

如果我需要這個類的一個實例?這個類在兩個字符串旁邊絕對沒有依賴關係。考慮一下Shutdown Hook,它會被立即執行一次,然後作爲Shutdown Hook傳遞給JVM。我應該用Guice創建這個實例嗎?這對我來說看起來很愚蠢,因爲沒有什麼可以注入,但是我必須編寫一個工廠接口來傳遞Guide兩個參數,並且必須爲我的FooBarClass創建一個接口來使用DI。

多個實例都需要

同樣的道理也適用於在那裏我需要這個類的多個實例的情況下。沒有依賴關係,但我必須創建一堆樣板代碼才能從中得到任何東西。這對我來說似乎是錯誤的。

那麼,我該如何使用DI和/或Guice?

非常感謝!

回答

23

它可能有助於拆分依賴關係數據

  • 依賴關係通常是服務:數據庫,時鐘和RPC存根。再加上所有的應用程序代碼:UserAuthenticator,PaymentHandlerEmailGateway。數據就是:DateMap<String,InetAddress>或甚至Customer。這些是簡單的內存域對象。

DI自然地最適合於事物的依賴性方面。您應該繼續爲您的數據模型類使用new

2

如果您要創建多個實例(如單個客戶),注入它們沒有意義。有意義的是創建一個CustomerFactory,它可以是@Singleton範圍,它可以創建具有所有依賴關係的Customer實例。

2

如果您想在測試特定類時忽略(隔離)其複雜性,則注入依賴項。如果這個類只是一個數據持有者,那麼它的代碼很簡單(get,set,equals)。在測試目標類時不需要嘲笑它,因此注入數據實例過度(通常很困難)。如果代碼不是微不足道的,那麼這個類不僅僅是一個數據持有者,你應該在單元測試中注入並模擬它。