Заметка: несколько реализаций, разные графы объектов - PullRequest
1 голос
/ 26 октября 2011

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

Существует класс 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 Ответ

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

Используйте обязательные аннотации для дифференциации каждого 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 {}
...