2012-09-05 111 views
3

使用吉斯,如果我有吉斯:使用@Named創建對象

@Inject @Named("light") 
Color light; 

我可以使用

bind(Color.class).annotatedWith(Names.named("light")) 
    .toInstance(new Color("white")); 

將其綁定到白色,如果Color構造只需要顏色名稱。

但是,如果Color構造函數也需要由Guice創建的對象,我該怎麼做?例如:

@Inject 
public Color(ColorSet colorset, String colorName) {...} 

其中colorset在運行時由Guice創建,並且在configure(){...}中不可用。

我想做到這一點,而不:

  • 創造的每個我需要注入直接使用反射來在我的代碼
  • 改變我的類(比如WhiteColor)
  • 顏色的類/子類使用ColorFactoy factory; factory.get("light");而不是@Named("light") Color light;

回答

13

做,這是不是一個工廠,但與@Provides methods的最好方法。我的公司非常非常廣泛地使用Guice,並且requestInjection總是被認爲是一個壞主意,因爲它可以很容易地建立一個非常脆弱的隱式依賴關係圖。

下面是它應該是什麼樣子:

public class FooModule extends AbstractModule { 
    protected void configure() { 
    // do configuration 
    } 

    @Provides 
    @Named("white") 
    Color provideWhiteColor(ColorSet colorSet) { 
    return colorSet.white(); // or whatever 
    } 

    @Provides 
    @Named("black") 
    Color provideBlackColor(ColorSet colorSet) { 
    return colorSet.black(); // or whatever 
    } 

    // etc 
} 
+0

這是個好主意,也許我也可以將它與Modules.override()。with()混合使用以重用它們。 –

+0

這是有幫助的 - 任何想法如何使用Guice注入器來獲取任一實例?尋找類似'Guice.createInjector(FooModule).getInstance(Color.class)',但具有「白色」或「黑色」的規格。 – Galz

+0

我不知道你如何使用@Named來做,但你應該使用綁定註釋(https:// github。com/google/guice/wiki/BindingAnnotations)。然後你可以說injector.getInstance(Key.get(Color.class,Black.class))(儘管我可能在某處丟失了泛型類型規範)。 getInstance(...)被重載以獲取Key(http://google.github.io/guice/api-docs/latest/javadoc/index.html?com/google/inject/Injector.html),而不是隻是一堂課。 –

2

您可以在模塊中設置一個工廠,然後請求注入以填充ColorSet。

模塊:

ColorFactory colorFactory = new ColorFactory(); 

requestInjection(colorFactory); 

bind(Color.class).annotatedWith(Names.named("light")).toInstance(colorFactory.buildColor("white")); 
bind(Color.class).annotatedWith(Names.named("dark")).toInstance(colorFactory.buildColor("black")); 

ColorFactory:

public class ColorFactory { 

    private ColorSet colorSet; 

    public Color buildColor(String color){ 
     return new Color(colorSet, color); 
    } 

    @Inject 
    public void setColorSet(ColorSet colorSet) { 
     this.colorSet = colorSet; 
    } 
} 
+0

哦,我讀了你不想每一種顏色的子類(即:WhiteColor)。你是否也在參考其他顏色? –

+0

他們有很多! –

+0

你能澄清你對ColorSet的使用嗎? –