Совет: когда начинать инъекцию / загрузку в JAR без головы? - PullRequest
2 голосов
/ 07 марта 2012

Итак, я пишу несколько компонентов (которые будут упакованы как JAR), и все они используют Guice для DI. Эти компоненты являются просто повторно используемыми JAR-файлами типа "commons", которые будут использоваться другими последующими проектами.

Мое понимание с Guice заключается в том, что вы реализуете конкретный Module и используете его для связывания объектов и, по сути, для настройки всех ваших DI. Насколько я понимаю, у вас должна быть одна фаза «начальной загрузки», когда создается инжектор Guice, а затем все зависимости, с которыми настроен модуль, затем извлекаются из этого инжектора с помощью injector.getInstance(SomeClass.class).

Это прекрасно работает в автономном приложении, у которого есть некоторая точка входа, где вы можете вызвать метод стиля init() для последующей загрузки Guice, но в JAR без заголовка, у которого нет точки входа, я борюсь с пытаясь определить, когда / где / как запустить Guice.

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

Но это действительно ужасное решение! Частично, потому что это потребовало бы, чтобы у каждого класса был свой собственный Module (что смешно), и это также загрязнило бы всю мою кодовую базу кодом, связанным с DI.

Я явно упускаю здесь некоторые основы Guice, иначе я не вижу, как Guice мог бы использоваться во всем, кроме приложения, где выполнение от начала до конца известно и контролируется. Любые примеры кода - огромный плюс! Заранее спасибо.

1 Ответ

5 голосов
/ 07 марта 2012

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

Конечно, вы неВам вообще не нужно выставлять модуль самостоятельно - вы можете предоставить другим возможность выполнять связывание.Тем не менее, вы можете пожелать предоставить модуль, чтобы избежать раскрытия деталей вашей реализации - вы можете предоставить открытый интерфейс и открытый модуль, но затем оставить пакет реализации закрытым.Модуль может связать интерфейс с реализацией, не обращая на это внимания вызывающего.

Вы также можете захотеть исследовать частных модулей , чтобы вы могли связывать зависимости, которые вашего кода. нуждается, не раскрывая их более широко.

Что-то, где-то придется создавать инжектор - но если ваш код является просто "библиотечным" кодом, то он почти определенно не должен быть ты.Вы не должны выполнять инъекцию самостоятельно - вы просто должны сделать свой код доступным для инъекции.

...