Guice: Построение связанных деревьев объектов / ножки робота - PullRequest
1 голос
/ 15 июля 2011

У меня есть класс 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) { }
}

Я хотел бы связать два разных A, один аннотированный @AhasB1 и другой @AhasB2.Как я могу связать их правильно?

Ответы [ 3 ]

3 голосов
/ 31 июля 2011

Вот как я это сделал, используя 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 голос
/ 30 июля 2011

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

  1. Вам понадобятся два экземпляра PrivateModule, по одному для B1 и B2
  2. Свяжите B с соответствующим типом бетона
  3. expose(A.class).annotatedWith(B1.class)

http://google -guice.googlecode.com / SVN / багажник / Javadoc / COM / Google / впрыснуть / PrivateModule.html

-dg

1 голос
/ 25 июля 2011

Вместо использования @Provides методов рассмотрим набор типов Provider<A>, возможно, вложенных в тип A, предоставляя вам доступ к приватному ctor.Или сделайте его защищенным пакетом ctor и поместите провайдеров в тот же пакет, что и он.Или, конечно, вы можете переместить тип вашего модуля в тот же пакет, что и A.

Другой вариант будет AssistedInject , который позволит вам указать набор методов, которые на основепо имени или параметру, будет возвращать разные экземпляры (в вашем случае, вероятно, подтипы A).Я думаю, что у него будет доступ к закрытым конструкторам.

Последняя мысль для вас: почему бы не оставить конструктор открытым как A, чтобы пользователь библиотеки мог вручную вводить зависимости?Если это только для внутреннего использования, документирования ctor также может быть достаточно.

...