guice: несколько реализаций, разные объектные графики

#guice #robot-legs-problem

#guice #проблема с ногами робота

Вопрос:

Как вы делаете следующее в guice?

Существует класс XmlSerializer , который зависит от интерфейса XmlFormatter . Существует 2 реализации XmlFormatter : CompactXmlFormatter и PrettyXmlFormatter .

Другой класс MyApplication зависит от 2 экземпляров XmlSerializer . Один экземпляр должен быть настроен с помощью a CompactXmlFormatter , а другой PrettyXmlFormatter

 public class XmlSerializer {
    public XmlSerializer(XmlFormatter formatter) {
       ...
    }
}

public interface XmlFormatter {
    ...
}

public class CompactXmlFormatter implements XmlFormatter {
    ...
}

public class PrettyXmlFormatter implements XmlFormatter {
    ...
}

public class MyApplication {
    public MyApplication(XmlSerializer compactSerializer, XmlSerializer prettySerializer) {
        ...
    }
}
  

Как вы строите такой график?

Я знаю, что, когда у вас есть 2 XmlSerializer экземпляра, для их введения MyApplication требуются аннотации в параметрах MyApplication конструктора.

Меня больше интересует, как вы привязываетесь XmlFormatter к обоим CompactXmlFormatter и PrettyXmlFormatter .

Ответ №1:

Используйте аннотации привязки, чтобы различать их XmlFormatter .

В вашем Module :

 bind(XmlFormatter.class).aannotatedWith(Pretty.class)
    .to(PrettyXmlFormatter.class);
bind(XmlFormatter.class).aannotatedWith(Compact.class)
    .to(CompactXmlFormatter.class);
  

И:

 @Inject public MyApplication(
    @Compact XmlSerializer compactSerializer, 
    @Pretty XmlSerializer prettySerializer) {
    ...
  

Конечно, вам нужно будет определить @Pretty и @Compact аннотации:

 @BindingAnnotation 
@Target({ FIELD, PARAMETER, METHOD }) 
@Retention(RUNTIME) 
public @interface Pretty {}

@BindingAnnotation 
@Target({ FIELD, PARAMETER, METHOD }) 
@Retention(RUNTIME) 
public @interface Compact {}
  

Комментарии:

1. Как это работает? потому что вы аннотируете XmlSerializer , но вы привязываете XmlFormatter : bind(XmlFormatter.class).annotatedWith(Pretty.class)

2. Ой, извините, кажется, я неправильно понял ваш вопрос. Тогда ваша проблема выглядит как обычная проблема «ноги робота», обсуждаемая в Guice WIKI, я думаю, вам стоит взглянуть на нее.

3. Похоже, что ноги робота — это то, что мне нужно, спасибо. Это выглядит очень сложно, хотя по сравнению с Spring…