我想能够有这个在我的代码吉斯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