guice multibinder与提供商

时间:2013-02-12 13:34:10

标签: guice

我想在我的代码中设置这个

@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);

此代码在启动时失败,因为它无法绑定我的Map

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 个答案:

答案 0 :(得分:2)

虽然Guice似乎可以互换地使用JSR-330注释,但似乎Multibindings在Provider内隐藏Map类型,因此可能期望注入java.util.Map<java.lang.String, com.google.inject.Provider<...>>代替。我无法重现您的问题,但请尝试一下,看看它是否有帮助。

旁注:如果您想避免在任何地方的代码中更改它,您可以将Map<String, javax.inject.Provider<Foo>>的提供程序绑定到接受多个绑定器创建的Map<String, com.google.inject.Provider<Foo>>的内容。如果我是对的并且这是问题所在,您可以将其修复到一个地方,而不是在javax.injectcom.google.inject之间的任何地方进行反复。

答案 1 :(得分: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(),即您只是尝试使用隐式基础提供程序。