2015-05-06 7 views
3

У меня есть класс, из которого экземпляры должны быть созданы (и уничтожены) для каждого запроса (dbSession в моем примере) и некоторые другие классы, которые используют экземпляры объекта запроса. Как это:Распространение области с помощью Guice

webservice --> repository --> dao --> dbSession 

(-> означает использование)

Но тогда у меня есть подобный случай использования, но dbsession не должен быть связан с запросом. Например:

webservice --> otherService --> repository --> dao --> dbSession 

В настоящее время класс dbSession связан с запросом. Для реализации другого варианта использования сеанс db не должен быть связан с запросом. Я мог бы использовать квалификаторы, чтобы сделать это, но затем мне нужно дублировать набор методов (необходимых) для обоих областей.

Итак, я ищу другое решение. Можно ли распространять области? Я имею в виду, что зависимости вводятся объектами области цели инъекции?

@request webservice --> @myScope otherService --> @myScope repository --> @myScope dao --> @myScope dbSession 

В примере, все зависимости от otherService должен быть в том же объеме, как otherService (вызов otherService является асинхронной).

Возможно ли это с Guice? И просто из любопытства: возможно ли это с CDI?

+0

Похож на случай проблемы с ногами робота: https://github.com/google/guice/wiki/FrequentlyAskedQuestions#how-do-i-build-two-similar-but-slightly-different-trees-of -объекты –

ответ

0

Я правильно понял?

Первый случай:

@Request webservice --> @Singleton repository --> @Singleton dao --> @Request dbSession 

Что вы ищете во втором случае:

@request webservice --> @myScope/@Singleton otherService --> @myScope/@Singleton repository --> @myScope/@Singleton dao --> @myScope/@noscope_session_per_query dbSession 

Я хотел бы предложить вам инкапсулировать репозиторий PrivateModule и expose только repository и otherService интерфейс. Затем свяжите в обоих модулях dbSession (это означает, что EntityManager предполагается?) Провайдер в разных объемах. Не забудьте использовать Provider<T> вместо прямого впрыскивания, когда вы начинаете смешивать области.

Второй вариант - использовать аннотацию для привязки поставщиков dbSession/EntityManager и вставить его с помощью соответствующей аннотации.

Смежные вопросы