0

我有一个接口:InterfaceA

我有一堂课:ConcreteA

我还有两个注释:@AnnotA@AnnotB

我已经完成了以下绑定:

bind(InterfaceA).annotatedWith(AnnotA).to(ConcreteA);
bind(InterfaceA).annotatedWith(AnnotB).to(ConcreteA);

接下来,ConcreteA 类有一个构造函数,它接受一个String名为hostName的参数。

class ConcreteA
{
    @Inject
    public ConcreteA(@Named("hostName") hostName) {
    }

    ... <rest of class>
}

我需要代码来描述以下内容:

如果 ConcretaA 正在使用 @AnnotA,则将 hostName 与字符串值 'localhost' 绑定

如果 ConcreteA 正在使用 @AnnotB,则将 hostName 与字符串值“externalhost”绑定

对此有任何解决方案的想法吗?

4

2 回答 2

1

我认为在您的情况下,您可能会考虑将每个绑定放在自己的私有模块中。

class MyModule() { 
  install(new PrivateModule() {
    public void configure() {
       bind(InterfaceA).to(ConcreteA);
       bind(String.class).annotatedWith(Names.named("hostName").to("localhost");
       expose(InterfaceA).annotatedWith(AnnotA.class);
    }});
  install(new PrivateModule() {
    public void configure() {
       bind(InterfaceA).to(ConcreteB);
       bind(String.class).annotatedWith(Names.named("hostName").to("externalhost");
       expose(InterfaceA).annotatedWith(AnnotB.class);
    }});
}

(这是来自记忆,语法可能不是 100% 正确。)

有关更多详细信息,请从Guice FAQ开始,然后在该页面中搜索“机器人腿”——我不是在开玩笑 :)

FAQ 的该部分的两个附加链接背后还有更多详细信息。

于 2011-10-06T03:24:53.187 回答
0

这是解决机器人两条腿问题的完整示例代码清单:

http://pastie.org/368348

于 2011-10-06T07:49:11.697 回答