2010-02-01 74 views
4

您的建議是什麼?何處保持guice噴射器?

我發現最適合我的解決方案 - 保持枚舉類中的注入器和模塊。 優點:

  1. 噴射器和創建一次模塊,
  2. 噴射器可以從不同的類,同時運行的應用程序中使用(不僅在自舉),
  3. 噴射器保持在一個位置,可以很容易找到。

例子:

import static ru.package.Modules.*; 

public enum Injectors { 

FOO_INJECTOR(BarModule.module()), 

FOO2_INJECTOR(FOO_INJECTOR.injector(), 
     Bar2Module.module(), FooModule.module()); 

private final Injector m_injector; 

Injectors (Module... modules) { 
    m_injector = Guice.createInjector(modules); 
} 

Injectors (Injector parentInjector, Module... modules) { 
    m_injector = parentInjector.createChildInjector(modules); 
} 

public Injector injector() { 
    return m_injector; 
} 
} 
+8

不要這樣做。這個策略有很多問題。在你的程序的每一次執行中,所有的注射器都將被創建,無論它們是否需要。 – 2010-02-01 15:59:59

回答

5

更大的問題是爲什麼呢?

應該沒有必要保持Injector左右,因爲一旦注射完成,Injector應該完成並應該消失。

但是,如果你真的需要Injector,不能你只需:

@Inject 
private Injector injector; 

這是應用基於網絡的或者是獨立位置?

+0

此代碼也用於網頁,但不僅如此。 關於注射注射器我問了已經問題:http://stackoverflow.com/questions/2176216/how-to-inject-injector。 問題是,guice不允許綁定或提供注入器。 – 2010-02-01 12:08:41

+0

我不得不同意ColinD,瞭解DI的工作原理可能很有用。它會爲你節省很多時間和精力:) – gpampara 2010-02-02 05:38:46

16

您似乎從根本上誤解了依賴注入是如何工作的。如果您嘗試在您的代碼中的任何位置使用對引導應用程序的地方的引用,則不使用依賴注入,而是將其用作服務定位器。每當你需要測試一個類時,你不得不準備一個Injector,並且你的類沒有在構造函數中清楚說明它們的依賴關係是什麼(因爲誰知道他們會用某種方法從Injector中得到什麼,如果他們有或者可以得到它的參考)。實際上,使用enum就像你在這裏描述的那樣甚至更糟:你甚至不能改變配置,甚至是測試,因爲你的模塊被硬編碼到枚舉中。

使用依賴注入時,類僅聲明其依賴關係,並允許Injector透明地工作(在初始調用獲取根應用程序對象之後)以提供所有這些依賴關係。這使得在您的代碼中理解,測試和更改功能相對容易。無論如何,我建議更多地瞭解DI和Guice是如何使用的......你真的不應該這麼做。

+0

我是DI和Guice的新手,所以請耐心等待)1)它用於web應用程序,所以我需要在運行時分配帶有所有依賴關係圖的對象,不僅僅是在自舉。 2)枚​​舉。每次想要測試時都不應該更換模塊。對於測試,您可以配置單獨的模塊和注入器(如果需要)。 3)爲什麼我必須使用注入器僅用於根對象?舉個例子,AOP呢? – 2010-02-02 08:01:15

+0

@ColinD我對注入器有類似的需求,因爲我不僅需要在構建過程中執行DI,而且還希望能夠在運行時訪問Singleton實例(通過Beanshell進行運行時調試等)。換句話說,我需要某種單身人士的註冊表。現在,沒有DI,我們通常會使用靜態最終字段來保存它,但現在使用Guice DI,注入器似乎是註冊表的自然選擇。 – RAY 2012-11-06 04:11:20

+0

考慮遺留應用程序,其中立即在依賴關係圖中隨處應用依賴注入可能不切實際。當您嘗試逐漸引入依賴注入時,您最終將注入器用作服務定位器的一些用途,並將其作爲戰略部署。 – beluchin 2014-03-28 20:51:04