Привязка аргумента конструктора на основе аннотации класса - PullRequest
0 голосов
/ 05 октября 2011

У меня есть интерфейс: 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, тогда bindhostName со строковым значением 'localhost'

Если ConcreteA использует @AnnotB, тогда свяжите hostName со строковым значением 'externalhost'

Любые идеирешения для этого?

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Я думаю, что в вашем случае вы могли бы рассмотреть возможность помещения каждой привязки в отдельный закрытый модуль.

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% правильным.)

Для более подробной информации, начните с FAQ по Guice и найдите на этой странице слова "ноги робота" - я не шучу:)

За двумя дополнительными ссылками из этого раздела часто задаваемых вопросов есть еще больше деталей.

0 голосов
/ 06 октября 2011

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

http://pastie.org/368348

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...