我试图能够在我的代码中有这个
@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().to 方法签名现在都是错误的,因为他们想要一个
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 个类会非常不方便:(。
谢谢,院长