我想在我的代码中设置这个
@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个类非常不方便:(。
感谢, 迪安
答案 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.inject
和com.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()
,即您只是尝试使用隐式基础提供程序。