Реализация внедрения Java с использованием TypeLiteral

У меня есть проект, предоставляющий интерфейс, назовем его IImplementMe, который я хочу внедрить в свой проект. Этот интерфейс будет реализован разными производителями, поэтому мне нужно внедрить все реализации. Я пытаюсь использовать TypeLiteral для этого.

Вот код производителя:

@Singleton
public class SomeImplementation implements IImplementMe {

private final String value;

@Inject
public SomeImplementation(final SomeOtherConfig configuration) {
    this.value= configuration.getValue();
}

@Override
public String getValue() {
    return value;
}
}

И в моем классе регистратуры у меня есть register(IImplementMe.class).to(SomeImplementation.class);

Затем в моем проекте я ввожу это так:

@Inject
public SomeEndpoint(final List<IImplementMe> implementations){
///
}

и я связываю это как

private static class MarketDataSetTypeLiteral extends TypeLiteral<List<IImplementMe>> {
}
bind(new MarketDataSetTypeLiteral()).toRegistry();

Я убедился, что мой конструктор SomeIMplementation вызывается, но в моей конечной точке список пуст, поэтому реализация не предоставляется. Я использую guice для инъекций. Любые идеи ?

Л.Э.: Получается, что предоставленная реализация создается после того, как создан мой класс конечной точки (во время создания он вставляет ссылку на пустой список). Позже в жизненном цикле ссылка обновляется реализацией, поэтому у меня действительно есть доступ к ней после того, как guice сделает это.

Я предполагаю, что это связано с зависимостями maven и тем, как guice обрабатывает экземпляры. Поскольку производитель должен иметь зависимость от моего проекта, я думаю, имеет смысл, что он создается последним, что вызывает мою первоначальную проблему.


person D.Razvan    schedule 18.04.2016    source источник
comment
Я не уверен, что понимаю, почему у вас есть CustomTypeLiteral (вы имели в виду MarketDataSetTypeLiteral?) или что вы пытаетесь сделать с toRegistry. В общем, похоже, что вы пытаетесь реализовать функцию, аналогичную Multibindings, но с вашим собственным реестром. Можете ли вы показать нам больше того, что должен делать bind(...).toRegistry(), или как вы его реализовали?   -  person Jeff Bowman    schedule 18.04.2016
comment
Да, извините, это должен быть MarketDataSetTypeLiteral. А для реализации реестра это в основном реализация реестра yar (ссылка: github.com/javabits/yar/blob/master/yar-guice/src/main/java/org/).   -  person D.Razvan    schedule 20.04.2016


Ответы (1)