Получение нескольких одинаковых одинаковых типов
Вы можете получить 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 (что также относится к каждому проекту с хорошими юнит-тестами).