Несколько привязок к одному экземпляру провайдера с помощью Guice - PullRequest
0 голосов
/ 15 марта 2012

У меня есть два интерфейса A и B, и B расширяет A.

У меня есть один поставщик, который может предоставить экземпляры, класс которых реализует B (и, следовательно, A).

Я хотел бы привязать Provider к B.class (просто) и к A.class с аннотацией в одноэлементной области видимости.

bind(B.class).toProvider(MyBImplProvider.class).in(Scopes.SINGLETON);
bind(A.class).annotatedWith(Names.named("B")).toProvider(MyBImplProvider.class).in(Scopes.SINGLETON);

Как вернуть тот же экземпляр у провайдера, независимо от того, введу ли я через B.class или через A.class + Annotation. Например, я хотел бы иметь возможность определять конструкторы как

@Inject
C(B param)

или

@Inject
C(@Named("B") param)

В обоих случаях мне бы хотелось, чтобы param оценивался с одним и тем же синглтоном.

1 Ответ

3 голосов
/ 15 марта 2012

Как насчет зависимости вашего провайдера A от провайдера B, которого вы определили выше?

@Provides 
@Named("B")
A provideA(Provider<B> bProvider) {
  return bProvider.get();
}

Это должно сработать, так как вы сказали, что B расширяет A. Возможно, вам придется поиграться с битом @Named.

Другим вариантом будет использование привязки toInstance(yourObject). Но это усложняет внедрение любых зависимостей в этот объект. Вы должны использовать Binder#requestInjection().

...