我使用com.google.inject:guice
。在我的项目中,我包含一个依赖项,该依赖项具有一个模块(扩展了com.google.inject.AbstractModule
的类),该模块定义了这样的MapBinder
public class ParentGuiceModule extends AbstractModule {
@Override
protected void configure() {
MapBinder.newMapBinder(binder(), TypeLiteral.get(String.class), TypeLiteral.get(SomeModuleClass.class));
...
}
}
在我的模块类中,我想获取该
MapBinder
并为其添加新的绑定。我的意思是我想写这样的东西:public class MyGuiceModule extends AbstractModule {
@Override
protected void configure() {
MapBinder<String, SomeModuleClass> parentModules = MapBinder.get(binder(), TypeLiteral.get(String.class), TypeLiteral.get(SomeModuleClass.class));
parentModules.addBinding("MyId").to(MyClass.class);
}
}
我怎样才能做到这一点?我无法更改父模块。
我查看了
MapBinder
类,似乎它没有任何方法可以安装MapBinder
。 最佳答案
这正是MapBinder设计的目的-毕竟,如果您从单个Module内知道将在MapBinder内部的所有内容,则只需编写@Provides Map<Foo, Bar>
或bind(new TypeLiteral<Map<Foo, Bar>>(){})
即可完成。
从MapBinder top-level docs:
支持从不同模块提供映射绑定。例如,可以使CandyModule和ChipsModule都创建自己的MapBinder<String, Snack>
,并为小吃地图贡献绑定。当该映射被注入时,它将包含来自两个模块的条目。
不要被名称newMapBinder
所阻止:只要您具有与newMapBinder
完全相同的参数,并且两个模块都安装在同一个Injector中,您将获得一个包含两个模块绑定的Map 。