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

Как ты делаешь следующее в действии?

Есть класс XmlSerializer это зависит от интерфейса XmlFormatter, Есть 2 реализации XmlFormatter: CompactXmlFormatter а также PrettyXmlFormatter,

Другой класс MyApplication зависит от 2 случаев XmlSerializer, Один экземпляр должен быть настроен с 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 {}
Другие вопросы по тегам