У меня есть проект, предоставляющий интерфейс, назовем его 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 обрабатывает экземпляры. Поскольку производитель должен иметь зависимость от моего проекта, я думаю, имеет смысл, что он создается последним, что вызывает мою первоначальную проблему.
CustomTypeLiteral
(вы имели в видуMarketDataSetTypeLiteral
?) или что вы пытаетесь сделать сtoRegistry
. В общем, похоже, что вы пытаетесь реализовать функцию, аналогичную Multibindings, но с вашим собственным реестром. Можете ли вы показать нам больше того, что должен делатьbind(...).toRegistry()
, или как вы его реализовали? - person Jeff Bowman   schedule 18.04.2016