Guice Assisted Inject с одноэлементным прицелом - PullRequest
4 голосов
/ 18 октября 2011

У меня есть интерфейс A, а класс B реализует A.

Тем не менее, конструктор B выглядит так:

     public class B (C c){}

, где C - это класс библиотеки третьей стороны иможет быть создан только после начальной загрузки.и я хочу, чтобы B был одиночкой.

Мне было трудно реализовать это в Guice.Я знаю, что могу использовать вспомогательный инжектор, чтобы сделать это:

    public class B (@Assisted C c){}

    public AFactory {
          public A createA(C c);
    }

, но, похоже, вспомогательный инжектор не может создать единичный экземпляр.

Есть идеи, как это реализовать?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 19 октября 2011

Как вы узнали, вы не можете использовать вспомогательный инжект для создания синглетонов.Assisted Inject предназначен для случаев, когда требуются программные параметры, а синглтоны не создаются программно.

Синглтоны создаются лениво , если только вы не вызовете asEagerSingleton() для привязки в вашем модуле.Таким образом, вы можете просто ввести C в B, и ваш экземпляр C будет создан после того, как инжектор guice будет создан.Если создание C более сложное, создайте поставщика C и привяжите его к своему модулю.

1 голос
/ 19 октября 2011

Я не думаю, что вам нужна вспомогательная инъекция.

Вы думали о реализации (и связывании) Provider<C>?Затем C становится доступным для ввода в B (и везде, где требуется C).

1 голос
/ 18 октября 2011

В вашем Module вы можете создать экземпляр C и добавить его в контекст. Тогда вы можете аннотировать класс B как обычно.

@Singleton
public class B...
...