Скажем, я хочу создать общего поставщика, который возвращает первый элемент в коллекции. Что-то вроде:Явно добавить зависимость связывания при связывании с экземпляром поставщика Guice
class P extends Provider<T> {
private final Provider<Collection<T>> provider;
FirstItemProvider(Provider<Collection<T>> provider) {
this.provider = provider;
}
@Override
public T get() {
Collection<T> input = provider.get();
Iterator<T> iter = input.iterator();
return iter.hasNext() ? iter.next() : null;
}
}
Теперь у меня есть такие различные коллекции с различными примечаниями, и я хочу, чтобы добавить привязки к этому провайдеру, но я также хочу, чтобы иметь возможность пройти привязки с помощью DefaultBindingTargetVisitor и getDependencies().
Я пытался что-то вроде:
bind(Key.get(type, annotation))
.toProvider(new P(
getProvider(
Key.get(Types.collectionOf(type.getType()), annotation)
)
));
Это прекрасно работает в условиях связывания, но обход не вок, как Guice не обнаруживает зависимость.
Я не мог найти другого способа привязки к аннотированному продюсеру, так как на нем нет аннотации.
Есть ли способ сделать то, что я пытаюсь сделать?
Благодаря Yaron
Возможно, есть '' P' реализовать HasDependencies'? Не проверял. –
IIRC HasDependencies - это связующий интерфейс, не связанный с провайдерами, а код просто сканирует провайдера для точек впрыска, поэтому он не будет работать. Я еще раз взгляну на исходный код, чтобы убедиться. – Yaron
Вот пример того, что я думаю: https://github.com/google/guice/blob/master/extensions/assistedinject/src/com/google/inject/assistedinject/FactoryProvider.java#L165 –