Получение нескольких одинарных одинаковых типов - PullRequest
12 голосов
/ 03 августа 2009

можете ли вы получить 2 экземпляра синглтона одного и того же базового типа?

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

Ответы [ 2 ]

16 голосов
/ 03 августа 2009

В Guice тоже легко! Создайте две аннотации, например, @One и @Two, а затем

bind(MySingleton.class).annotatedWith(One.class).toInstance(new MySingleton());
bind(MySingleton.class).annotatedWith(Two.class).toInstance(new MySingleton());

, а затем

@Inject
public SomethingThatDependsOnSingletons(@One MySingleton s1,
    @Two MySingleton t2) { ... }
15 голосов
/ 11 сентября 2009

Я хотел бы дополнить ответ Марцина, добавив, что вам не нужно ограничивать себя использованием toInstance() или методов провайдера в такой ситуации.

Следующее будет работать так же хорошо:

bind(Person.class).annotatedWith(Driver.class).to(MartyMcFly.class).in(Singleton.class);
bind(Person.class).annotatedWith(Inventor.class).to(DocBrown.class).in(Singleton.class);

[...]

@Inject
public BackToTheFuture(@Driver Person marty, @Inventor Person doc) { ... }

Guice будет вводить зависимости как обычно при создании экземпляров классов MartyMcFly и DocBrown.


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

bind(Person.class).annotatedWith(Driver.class).to(Person.class).in(Singleton.class);
bind(Person.class).annotatedWith(Inventor.class).to(Person.class).in(Singleton.class);

Чтобы это работало, вы должны убедиться, что Person не связан в области действия Singleton, явно в модуле Guice или с аннотацией @Singleton. Подробнее в этом Гисте .

Edit: Пример кода, который я привожу в качестве примера, взят из Guice Grapher Test . Просмотр тестов Guice - отличный способ лучше понять, как использовать API (что также относится к каждому проекту с хорошими модульными тестами).

...