2013-02-12 137 views
1

我想能夠有這個在我的代碼吉斯multibinder與供應商

@Inject 
private Map<String, Provider<Processor>> providers; 

我是想,但是這個代碼不編譯

MapBinder<String, Provider<Processor>> mapbinder = MapBinder.newMapBinder(binder, String.class, Provider<Processor>.class); 
mapbinder.addBinding("splineV1Beta").to(SplineProcessor.class); 
mapbinder.addBinding("invertV1Beta").to(InvertProcessor.class); 

此代碼啓動失敗,因爲它無法綁定我的地圖

MapBinder<String,Processor> mapbinder = MapBinder.newMapBinder(binder, String.class, Processor.class); 
mapbinder.addBinding("splineV1Beta").to(SplineProcessor.class); 
mapbinder.addBinding("invertV1Beta").to(InvertProcessor.class); 

如何在此處正確設置綁定?

注意:我也在尋找一些簡單的東西,所以開發人員只需在每次有新處理器時添加一行(我希望我不必添加一行+一些工廠接口...應該是方式,但除了上面的TypeLiteral和toProvider()方法外,我還嘗試了其他方法)。我發現如果我有下面的行(但不要調用addBinding)Guice實際上會啓動這是好的,但所有addBinding()。方法簽名現在都是錯誤的,因爲它們是錯誤的想

Provider<? extends Provider<Processor>> 
//This below line ends up with mabbinder2.addBinder().to() wanting the above param type? 
MapBinder<String, Provider<Processor>> mapbinder2 = MapBinder.newMapBinder(binder, stringLit, list); 

從根本上改變了我的思想,我嘗試注入這樣的事情(希望map.get(「XXX」)創建新實例每次...

@Inject 
private Map<String, Processor> providers; 

我束縛像這樣,但不幸的是,地圖總是返回相同的實例:(...

MapBinder<String, Processor> mapbinder = MapBinder.newMapBinder(binder, String.class, Processor.class); 
mapbinder.addBinding("splineV1Beta").toProvider(new TypeLiteral<Provider<SplineProcessor>>() {;}); 
mapbinder.addBinding("invertV1Beta").toProvider(new TypeLiteral<Provider<InvertProcessor>>() {;}); 

編輯:根據本文檔http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/MapBinder.html你可以有一個

MapBinder<String, Snack> and inject a Map<String, Provider<Snack>> 

,但是當我這樣做(帶私人領域),我得到以下......(而當我改變我的其他解決方案,但不叫mapbinder.addBinding,它結合並工作得很好)......

1) No implementation for java.util.Map<java.lang.String,  
javax.inject.Provider<controllers.modules2.framework.Processor>> was bound. 

我一定要使用構造器注入該像他們爲榜樣的工作?我是一個抽象類,所以這將是非常不方便,更改10類:(。

感謝, 院長

回答

2

雖然吉斯似乎是有關使用JSR-330註解互換非常好,似乎Multibindings隱藏內Map,因此Provider類型可以期待注入java.util.Map<java.lang.String, com.google.inject.Provider<...>>,而不是我一直無法重現你的問題,但嘗試,看看它是否有助於

邊注:如果你想避免改變它的代碼無處不在,你可以hackishly綁定Map<String, javax.inject.Provider<Foo>>提供者的東西akes在multibinder創建Map<String, com.google.inject.Provider<Foo>>。如果我是對的,這就是問題所在,你可以將它解決一個地方,而不是在各個地方跳到javax.injectcom.google.inject之間。

+1

您也可以升級到Guice 4以獲得修復。 – 2015-08-29 19:49:15

0

如果你想Map<String, Provider<Processor>>注入點,綁定的方式是:

MapBinder<String, Processor> mapbinder = MapBinder.newMapBinder(binder, String.class, Processor.class); mapbinder.addBinding("splineV1Beta").to(SplineProcessor.class); mapbinder.addBinding("invertV1Beta").to(InvertProcessor.class);

你會使用toProvider()如果提供自定義的供應商,你都沒有,也就是說你僅僅是試圖使用隱含的底層提供者。