2017-02-21 6 views
1

Я недавно начал работать с Java после 7 лет кодирования в .Net, не поймите меня неправильно, я ЛЮБЛЮ C#, но задание потребовало, и мне нужно было изменить.Auto Bind all `Services` с помощью Guice

Мой вопрос о регистрации Ioc, в C# Я использовал Windsor и SimpleInjector (который я полностью люблю), и в java я хочу начать использовать Guice.

Проект, над которым я работаю, является устаревшим проектом, который не использует Ioc за слова, это проект Джерси (с не функциональным HK2 IOC).

И теперь для моего вопроса, на C#, я зарегистрировал все интерфейсы и конкретную реализацию при запуске приложения во время выполнения с использованием отражения.

Я читал документацию Guice и не мог найти никакого примера для этого, и привязка JIT не совсем понятна.

Так можно ли это сделать? это лучшая практика? (Я не думаю, что вручную писать все привязки правильный курс)

Любые примеры или направление было бы очень полезно

Спасибо

+0

Как вы имеете в виду нефункциональный Hk2. Hk2 является довольно функциональным ... Hk2 также имеет надежную структуру для автоматической регистрации услуг с использованием популяций @Service и ServiceLocator – jwells131313

+0

@ jwells131313, что я имел в виду, так это то, что HK2 в нашей системе не работает. – guyl

ответ

3

Это немного сложнее сделать в Java и Guice, чем на других платформах: Java classloader предназначен для finding classes by their package/name with fallbacks, а не для перечисления каждого класса или реализации на пути к классам. Хотя существуют некоторые библиотечные решения для выполнения последнего в заданных условиях (например, Reflections или Google Guava), как правило, невозможно перебирать все классы, доступные через текущий ClassLoader и его родителей, поскольку набор теоретически бесконечен через URLClassLoader и аналогичные сетевые загрузчики классов ,

Это делает его распространенным и часто необходимо явно перечислять ваши интерфейсы и реализации, чтобы выставлять ваше приложение независимо от того, используете ли вы Guice или нет.

См:

Следовательно, трудно выполнять такие задачи, как "начать все достижимый класс, который реализует MyStartableService", хотя через Guice SPI вы можете иметь более удачи с "начать каждый MyStartableService, запрошенный через Guice, прежде чем возвращать его". Кроме того, вы также можете использовать Java SPI framework, встроенный в Java 6 (например, ServiceLoader), чтобы разрешать распределенные или распределенные списки соответствующих служб, которые затем могут быть отправлены в Guice через вызовы bind в модуле. (Оливье метко предлагает AutoService в комментариях, что позволяет легко генерировать файлы метаданных, которые питают ServiceLoader.)

+1

Если вы перейдете к основному интерфейсу SPI, попробуйте использовать [AutoService] в Google (https://github.com/google/auto/tree/master/service): это спасатель жизни: вы не трогаете никаких не- java file, вы просто добавляете небольшую аннотацию, и все делается автоматически. –

+0

Благодарим вас за подробный ответ, Я постараюсь понять, как действовать дальше – guyl

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