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);
            }
        });
}

Я думаю, что решение, которое вы ищете, это частные модули

  1. Вам понадобятся два экземпляра Private Module, по одному для B1 и B2.
  2. Привязать B к соответствующему типу бетона
  3. 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 также может быть достаточно.

Другие вопросы по тегам