То, что вы хотите, возможно, если создать две разные привязки в одном модуле.
(Примечание: если вы не знакомы с BindingAnnotations, вы можете узнать больше здесь .В моих примерах я буду использовать @UsingSystemDataSource
в качестве аннотации привязки.)
Использование EDSL в методе configure()
:
protected void configure() {
// binding for private use
bind(DataSource.class).to(SystemDataSourceImpl.class).in(Scopes.SINGLETON);
// binding for public use
bind(DataSource.class).annotatedWith(@UsingSystemDataSource.class).to(DataSource.class);
expose(DataSource.class).annotatedWith(@UsingSystemDataSource.class);
}
Теперь, если вам нужно сделать это безиспользуя EDSL, методы вашего частного модуля @Provides
будут выглядеть так:
@Provides
@Exposed
@UsingSystemDataSource
DataSource provideDataSourcePublicly(DataSource privatelyBoundDatasource) {
return privatelyBoundDatasource;
}
@Provides
@Singleton
DataSource provideDataSource() {
return ...;
}
Почему это даже работает?
Это фактически создает дваразличные привязки - одна связывает DataSource
с SystemDataSource
, а другая связывает @UsingSystemDataSource DataSource
с DataSource
.Используя метод expose()
или @Exposed
, закрытый модуль предоставляет only аннотированную версию привязки.(Я не смог найти источник, который явно заявляет, что он работает для этого варианта использования, поэтому я протестировал его сам.)