2012-01-25 25 views
2

我在GWT項目集(「主項目」,「Widgets項目」,「服務適配器項目」)中存在循環依賴項問題。主要參考小部件和服務適配器。小部件引用服務適配器。問題來了。我想幾乎在任何地方都使用EventBus,注入。我應該在哪裏放置我的Ginjector界面?在兩個Ginjector實例中使用@Singleton

它必須能夠從每個項目中使用,並且必須從每個項目引用類,以便能夠注入來自不同項目的類。這顯然是不可編譯的。

我想爲窗口小部件使用一個單獨的Ginjector,而只有一個用於EventBus。如果兩個單獨的Ginjectors使用兩個單獨的GinModules都包含@SingletonEventBus綁定,那麼這兩個getter會返回相同的EventBus實例嗎?

注意:這是一個杜松子酒,而不是Guice的問題。

回答

3

最簡單的方法我能想到的是創建EventBus作爲獨立的噴油單(或使其在一些類的靜態最終場),然後使用@Provides在其他注射器獲得對特定EventBus實例的訪問。

1

我爲每個邏輯部分創建一個模塊(每個項目經常有一個或多個),然後從入口點提供一個單一的ginjector,引用它需要的所有模塊。所有(幾乎)通過入口點的都是由Gin創建的,所以它將能夠注入字段。

每個GWT.create'd的新投影機都有自己的一套單體,所以僅創建一個單根投影機非常重要。可以將該注入器注入代碼庫的其他部分,但如果不這樣做,通常會生成更多可讀代碼。

如果您需要將EventBus或其他任何事件傳遞給非Gin創建的對象,則有幾個選項。首先是構建您自己的提供程序實例,並將其綁定到模塊中(或在模塊中創建方法,註釋號爲@Provides)。第二個是在ginjector中創建採用單個參數並返回void的方法--Gin將能夠注入該聲明類型的所有字段和設置器。在下面的例子中,只有中的@Inject註解的字段和設置程序及其超類將被注入 - 它也不會查找子類。

void injectMyWidget(MyWidget widget); 
相關問題