我有一个界面: InterfaceA 。
我有一个班级: ConcreteA 。
我还有两个注释: @AnnotA 和 @AnnotB 。
我完成了以下绑定:
bind(InterfaceA).annotatedWith(AnnotA).to(ConcreteA);
bind(InterfaceA).annotatedWith(AnnotB).to(ConcreteA);
接下来,类ConcreteA有一个构造函数,它接受一个名为 hostName 的String
参数。
class ConcreteA
{
@Inject
public ConcreteA(@Named("hostName") hostName) {
}
... <rest of class>
}
我需要使用代码来描述以下内容:
如果ConcretaA使用@AnnotA,则将hostName绑定为String值为“localhost”
如果ConcreteA正在使用@AnnotB,那么将hostName与String值'externalhost'绑定
对此有何解决方案?
答案 0 :(得分: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%正确。)
有关详细信息,请从the Guice FAQ开始,然后在该页面搜索“机器人腿” - 我不是在开玩笑:)
在常见问题解答的这一部分的两个附加链接背后还有更多细节。
答案 1 :(得分:0)
以下是解决机器人双腿问题的完整示例代码清单: