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