Привязка аргумента конструктора на основе аннотации класса

#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:

Вот полный список примеров кода для решения проблемы с двумя ногами робота:

http://pastie.org/368348