Правильная структура для внедрения зависимости (используя Guice) - PullRequest
2 голосов
/ 23 ноября 2011

Я хотел бы получить некоторые предложения и отзывы о том, как лучше структурировать внедрение зависимостей для системы со структурой, описанной ниже. Я использую Guice и поэтому предпочел бы решения, основанные на объявлениях, основанных на аннотациях, а не на XML-насыщенной конфигурации в стиле Spring.

Рассмотрим набор похожих объектов, Ball, Box, and Tube, каждый из которых зависит от Logger, предоставленного через конструктор. (Это может быть не важно, но все четыре класса - это синглтоны - приложения, а не Gang-of-Four, разновидность.)

Класс ToyChest отвечает за создание и управление тремя объектами формы. ToyChest само по себе не зависит от Logger, кроме создания объектов формы, которые являются.

Класс ToyChest создается как одноэлемент приложения в классе Main.

Я не уверен, как лучше построить фигуры в ToyChest. Мне либо (1) нужен доступ к экземпляру Guice Injector, уже прикрепленному к Module привязке Logger к реализации, либо (2) необходимо создать новый Injector, присоединенный справа Module.

(1) достигается добавлением поля @Inject Injector injector к ToyChest, но это кажется странным, потому что ToyChest на самом деле не имеет никаких прямых зависимостей - только от дочерних элементов, которые он создает.

Для (2) я не уверен, как передать соответствующий Module.

Я на правильном пути? Есть ли лучший способ структурировать это?

В ответах на этот вопрос упоминается прохождение Provider вместо непосредственного использования инжектора, но я не уверен, как это должно работать.

EDIT:

Возможно, более простой вопрос: при использовании Guice, где находится подходящее место для конструирования объектов фигур? ToyChest выполнит некоторую настройку с ними, но я предполагаю, что они могут быть созданы в другом месте. ToyChest (как контейнер, управляющий ими), а не Main, мне просто кажется подходящим местом для их создания.

1 Ответ

3 голосов
/ 24 ноября 2011

Правильный способ - заставить guice построить ваши зависимости.То есть создайте и настройте.

В вашей ситуации у вас должен быть инжектор, встроенный в Main.Из инжектора вы получаете ToyChest.Когда вы получаете ToyChest через инжектор, он управляется обманом, и вы можете рассчитывать на то, что он предоставит все правильно настроенные зависимости.

В вашем случае вы можете ввести Provider<Ball>, Provider<Box> и т. Д. В ToyChest и при необходимости просто получить экземпляр у провайдера.ToyChest не несет ответственности за создание экземпляра, только за его использование.Вы также можете проверить MapBinder , если у вас есть архитектура плагинов.

Пока что все управляется с помощью guice, поэтому формы могут вводиться в их регистратор без знания класса using.

Если у вас есть некоторые параметры времени выполнения, которые вы хотите передать во вновь созданные экземпляры фигур, вы можете использовать AssistedInject .

Просто подсказка: вам не нужно использовать конструкторинъекция, вы можете делать инъекцию в поле или в сеттер, что упрощает конструктор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...