2013-02-12 78 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()如果提供自定义的供应商,你都没有,也就是说你仅仅是试图使用隐含的底层提供者。