Получение нескольких одинаковых одинаковых типов

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

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

2 ответа

Решение

В 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) { ... }

Я хотел бы дополнить ответ Марцина, добавив, что вам не нужно ограничивать себя в использовании 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 аннотаций. Больше подробностей в этом Гисте.

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

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