我想能夠有這個在我的代碼吉斯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類:(。
感謝, 院長
您也可以升級到Guice 4以獲得修復。 – 2015-08-29 19:49:15