2012-01-13 144 views
1

新到谷歌吉斯注射器。我想用它來處理所有IOC和AOP方法攔截的三個組成部分,我發展:吉斯:創建共享庫

  • WidgetClient - 一個Swing應用程序
  • WidgetServer - 一個小EAR客戶端將連接到/溝通
  • WidgetShared - 包含由客戶端和服務器

隨着Swing應用程序使用的普通班「公地」 JAR,什麼地方我會做出一個明確的調用可能看起來像:

public static void main(String[] args) { 
    initGuiceInjectors(); 
} 

private static initGuiceInjectors() { 
    Guice.createInjector(mySwingAppModule); 
} 

mySwingAppModule將定義Swing應用程序相關性的所有綁定。我將在服務器EAR中做一些非常類似的事情。

當談到WidgetShared庫時,我很窒息,因爲lib沒有一個入口點:它只是一大堆客戶端和服務器將會使用的包,類,接口和枚舉這個地方。

所以我的第一個問題:我在哪裏調用Guice.createInjector()WidgetShared JAR?

這個問題強調了一個SEGUE到第二(類似)的問題,這就是爲什麼我選擇在這裏組爲好。

我仔細閱讀了Guice的「最佳實踐」,並且壓倒性的共識似乎是(如適用的話),在包級別保留Module的實現。因此,對於每個包,將有該包內的所有類型的一個Module結石定義綁定。這是針對整個應用定義綁定的單個單塊Module的改進。

因此,上面的代碼片段(Guice.createInjector(mySwingAppModule))實際上是而不是我的代碼最終會看起來像什麼(對不起,我說謊!)。

我的第二個問題是:什麼是「最佳實踐」爲創建多個注射器?

我看到createInjector(Module... modules)可以採取可變參數Module參數。所以,對我來說好像如果我要擁抱這個「1模塊每包」最佳實踐,在某些時候,我必須有代碼,要麼是這樣的:

Guice.creatorInjector(package1Module, package2Module, package3Module, 
    package4Module, package5Module, package6Module, ..., packageNModule); 

,或者像這樣:

Guice.createInjector(package1Module); 
Guice.createInjector(package2Module); 
Guice.createInjector(package3Module); 

... 

Guice.createInjector(packageNModule); 

這兩個看起來真的很討厭!有沒有更好的方法來完成這個?!?

在此先感謝!

回答

4

亞當,

有兩個元素,你的問題,但顯然二者相關。我會倒退,首先從第二個元素開始。

每包一個模塊的組織是非常重要的,因爲它給出了where綁定應放置可預測的慣例,並作爲獎勵,它可以讓你打包進行相應的保護你的類。還有創建充當主要安裝每個包模塊的集合,以作爲需要被安裝到添加綁定庫的給定配置的單個模塊的複合模塊的流行的概念。安裝這個單一模塊成爲庫和使用它的服務器/應用程序之間的主要集成點。

退回給你的第一個點,它不建議在每個應用程序的多個注射器。更好的是讓一個注入器安裝它需要的模塊以滿足應用程序中使用的所有綁定。

最後,你會碰到這樣的:

public WidgetSharedLibraryModule extends AbstractModule { 
    @Override protected void configure() { 
    install(new WidgetSublibraryModule1()); 
    install(new WidgetSublibraryModule2()); 
    ... 
    } 
} 

而且你的主要方法如下所示:

public static void main(String[] args) { 
    Injector injector = Guice.createInjector(
     new WidgetSharedLibrary(), 
     new WidgetSwingAppModule()); 
    WidgetSwingApp app = injector.getInstance(WidgetSwingApp.class); 
    app.run(); 
} 
+0

但是,如果我們已經一個注射器那麼我們如何把它傳遞到子模塊?換句話說,'submodule1'可能想要'submodule2'中的類的getInstance。 – DilTeam 2015-10-21 06:12:08