Guice: Построение связанных деревьев объектов / ножки робота
У меня есть класс A, который содержит класс B, как это:
class A {
private final B b;
@Inject
A(B b) {
this.b = b;
}
}
interface B {}
class B1 implements B {}
class B2 implements B {}
class Client() {
@Inject
Client(@AhasB1 A aHasB1, @AhasB2 A aHasB2) { }
}
Я хотел бы связать два разных, один аннотированный @AhasB1
и другой @AhasB2
, Как я могу связать их правильно?
3 ответа
Вот как я это сделал используя PrivateModule
,
public class MainModule extends AbstractModule {
@Override
protected void configure() {
install(new PrivateModule(){
@Override
protected void configure() {
bind(A.class).annotatedWith(AhasB1.class).to(A.class);
expose(A.class).annotatedWith(AhasB1.class);
bind(B.class).to(B1.class);
}
});
install(new PrivateModule(){
@Override
protected void configure() {
bind(A.class).annotatedWith(AhasB2.class).to(A.class);
expose(A.class).annotatedWith(AhasB2.class);
bind(B.class).to(B2.class);
}
});
}
Я думаю, что решение, которое вы ищете, это частные модули
- Вам понадобятся два экземпляра Private Module, по одному для B1 и B2.
- Привязать B к соответствующему типу бетона
expose(A.class).annotatedWith(B1.class)
http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Private Module.html
-dg
Вместо того, чтобы использовать @Provides
методы, рассмотрим набор Provider<A>
типы, возможно вложенные в тип A, предоставляя вам доступ к частному ctor. Или сделайте его защищенным пакетом ctor и поместите провайдеров в тот же пакет, что и он. Или, конечно, вы можете переместить тип вашего модуля в тот же пакет, что и A.
Другим вариантом будет AssistedInject, который позволит вам указать набор методов, которые на основе имени или параметра будут возвращать разные экземпляры (в вашем случае, возможно, подтипы A). Я думаю, что это будет иметь доступ к частным конструкторам.
Одна последняя мысль для вас: почему бы не оставить конструктор A открытым, чтобы пользователь библиотеки мог вручную вводить зависимости? Если это только для внутреннего использования, документирования ctor также может быть достаточно.