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

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

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

从理论上讲,我可以使用@Named ,但我不能修改被注入的代码。 我想做的事情如下:

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

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

您可以使用私有模块来实现此目的,它允许您安装(相互不可访问的)冲突绑定,以用于构建一组有限的非冲突暴露绑定。 这通常被视为机器人腿部问题的解决方案,在这个问题中你需要(例如)暴露一个@Left Leg和一个@Right Leg ,其中Leg对象完全相同但是你绑定了不同的Foot实现( LeftFootRightFoot )在层次结构中向下。

此时,您没有指定“谁来获取它”,但是您为一个消费者与另一个消费者展示了略微不同的Injector图。

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