我有一个像这样的Gucie绑定设置:
MapBinder<String, MyInterface> mapBinder = MapBinder.newMapBinder(binder(), String.class, MyInterface.class);
mapBinder.addBinding("a").to(MyClassA.class);
mapBinder.addBinding("b").to(MyClassB.class);
MyClassA当然实现了MyInterface。
每当我用键查询注入的地图时,它总是返回相同的实例:
class UserClass {
private final Map<String, MyInterface> map;
public UserClass(Map<String, MyInterface> map) {
this.map = map;
}
public void MyMethod() {
MyInterface instance1 = map.get("a");
MyInterface instance2 = map.get("a");
.....
}
......
}
在这里,我得到的instance1和instance2始终是同一对象。有什么方法可以配置Gucie始终从MapBinder返回不同的实例?
非常感谢
最佳答案
您可以通过注入Map<String, Provider<MyInterface>>
而不是Map<String, MyInterface>
来完成此操作。
interface MyInterface {}
class MyClassA implements MyInterface {}
class MyClassB implements MyInterface {}
class UserClass {
@Inject private Map<String, Provider<MyInterface>> map;
public void MyMethod() {
Provider<MyInterface> instance1 = map.get("a");
Provider<MyInterface> instance2 = map.get("a");
}
}
@Test
public void test() throws Exception {
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
MapBinder<String, MyInterface> mapBinder = MapBinder.newMapBinder(binder(), String.class, MyInterface.class);
mapBinder.addBinding("a").to(MyClassA.class);
mapBinder.addBinding("b").to(MyClassB.class);
}
});
}