#guice #guice-3
#guice #guice-3
Вопрос:
У меня есть интерфейс: 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, то привяжите имя хоста со строковым значением ‘localhost’
Если ConcreteA использует @AnnotB, то привяжите имя хоста со строковым значением ‘externalhost’
Есть идеи решения для этого?
Ответ №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 содержится еще больше подробностей.
Комментарии:
1. В настоящее время я читаю проблему с ногами робота, но обратите внимание, что класса ConcreteB нет. Существует только один класс ConcreteA.
Ответ №2:
Вот полный список примеров кода для решения проблемы с двумя ногами робота: