Guice:根据谁获得它来注入不同的实现?

时间:2016-03-23 19:09:12

标签: java guice

我有两个第三方类,它们都采用Authorizer接口的实现。我需要为每个实现注入不同的实现。

如果我执行@Provides,我该如何实现它以便它在运行时提供所需的实现?提供者不知道谁在要求注射。

理论上我可以使用@Named,但我无法修改正在注入的代码。我想做点什么:

bind(Authorizer.class).to(ImplA.class).for(SomeClass.class)
bind(Authorizer.class).to(ImplB.class).for(SomeOtherClass.class)

显然," for"代码不存在,但是有一些等效的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用Private Modules来实现此目的,它允许您安装(相互不可访问的)冲突绑定,以用于构建一组有限的非冲突公开的绑定。这通常被视为robot legs problem的解决方案,您希望(例如)在其中公开@Left Leg@Right Leg Leg对象同样但你已经在层次结构中进一步限制了不同的Foot实现(LeftFootRightFoot)。

此时,您没有指定“谁来获取它”,但是您为一个消费者与另一个消费者公开了一个略有不同的注入图表。

install(new PrivateModule() {
  bind(Authorizer.class).to(ImplA.class);
  expose(SomeClass.class);
});
install(new PrivateModule() {
  bind(Authorizer.class).to(ImplB.class);
  expose(SomeOtherClass.class);
});