所以根据我的测试,如果你有类似的东西:
Module modA = new AbstractModule() {
public void configure() {
bind(A.class).to(AImpl.class);
bind(C.class).to(ACImpl.class);
bind(E.class).to(EImpl.class);
}
}
Module modB = New AbstractModule() {
public void configure() {
bind(A.class).to(C.class);
bind(D.class).to(DImpl.class);
}
}
Guice.createInjector(Modules.overrides(modA, modB)); // gives me binding for A, C, E AND D with A overridden to A->C.
但是如果你想在modB中删除E的绑定怎么办?我似乎无法找到一种方法来做到这一点,而不必将E的绑定分解为一个单独的模块。有办法吗?
答案 0 :(得分:9)
SPI可以做到这一点。使用Elements.getElements(modA, modB)
获取Element
个对象的列表,代表您的绑定。遍历该列表并删除您要删除其键的绑定。然后使用Elements.getModule()
从过滤后的元素中创建一个模块。把它们放在一起:
public Module subtractBinding(Module module, Key<?> toSubtract) {
List<Element> elements = Elements.getElements(module);
for (Iterator<Element> i = elements.iterator(); i.hasNext(); ) {
Element element = i.next();
boolean remove = element.acceptVisitor(new DefaultElementVisitor<Boolean>() {
@Override public <T> Boolean visit(Binding<T> binding) {
return binding.getKey().equals(toSubtract);
}
@Override public Boolean visitOther(Element other) {
return false;
}
});
if (remove) {
i.remove();
}
}
return Elements.getModule(elements);
}
答案 1 :(得分:2)
Guice 4.0beta将返回只读元素列表。所以我修改了Jesse Wilson的代码如下。您需要做的是提供模块列表并减去要替换的目标绑定。
Injector injector = Guice.createInjector(new TestGuiceInjectionModule(), Utils.subtractBinding(new GuiceInjectionModule(),Key.get(IInfoQuery.class)));
功能
public static Module subtractBinding(Module module, Key<?> toSubtract) {
List<Element> elements = Elements.getElements(module);
return Elements.getModule(Collections2.filter(elements, input -> {
if(input instanceof Binding)
{
return !((Binding) input).getKey().equals(toSubtract);
}
return true;
}));
}