Получение нескольких однотипных однотипных ячеек
можете ли вы получить 2 экземпляра одного типа одного и того же базового типа?
это, очевидно, тривиально в spring, поскольку оно основано на именованных экземплярах, к которым вы присоединяете область видимости, но я не вижу эквивалента в виде, относящегося к типам привязки к классам реализации. Обратите внимание, что я не хочу привязываться к экземпляру, поскольку соответствующие экземпляры вводятся с помощью других зависимостей.
Ответы
Ответ 1
Легко и в Guice! Создайте две аннотации biding, скажем @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) { ... }
Ответ 2
Я хотел бы дополнить ответ Marcin, добавив, что вам не нужно ограничивать себя использованием методов 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
. Подробнее в этот Gist.
Изменить:
Пример кода, который я приводил в качестве примера, приведен из теста Guice Grapher.
Глядя на тесты Guice - отличный способ лучше понять, как использовать API (что также относится к каждому проекту с хорошими модульными тестами).