Мне нравится, как Guice делает достаточно прямо, чтобы вручную создавать свои собственные модули с их собственными привязками, выполненными в коде. С другой стороны, CDI, похоже, больше полагается на магию, а не на программный доступ к привязкам привязок. Я ошибаюсь или как можно добиться такого же эффекта с помощью WELD.
Любой образец кода будет оценен...
РАЗЪЯСНЕНИЕ
Я надеялся построить модуль (термин Guice sorry im unsure of the CDI term) программным путем, используя стиль шаблона компоновщика, заданный Guice на http://code.google.com/p/google-guice/.
Я создаю динамическую систему, и мне нужно, чтобы я мог связывать типы (например, интерфейсы), константы и т.д., а не просто проводить динамический поиск Weld в classpath и т.д., а также искать и регистрировать типы. Я считаю, что CDI является статическим, пакет javax.inject не включает никаких интерфейсов, которые позволяют программно связывать типы с реализациями.
РАЗРЕШЕНИЕ ЧАСТИ 2
Основная предпосылка исходного вопроса заключалась в простом наблюдении за тем, чтобы аннотации выпекались, а правила, определенные в них, чтобы помочь inejctor не могут быть изменены. Первоначально я хотел, чтобы публичный доступ к тем же интерфейсам, что и для сканера класса CDI, для создания определений для его внутреннего использования. В основном, я говорю, что я хочу слой, который позволяет мне читать аннотации и создавать определения для контейнера. Поставщик по умолчанию может быть тем, кто делает то, что происходит сейчас, но если вы хотите какую-то другую стратегию, тогда существует возможность сделать это.
Одной из проблем с нынешним подходом является ограничение, при котором нельзя выбирать компоненты (классы) с разными аннотациями для выбора разных соавторов. Прежде чем прыгать, позвольте мне квалифицировать это утверждение, да, это может быть сделано с провайдерами и такими, но это приводит к большему количеству артефактов. Должен быть более простой способ.
Пример1
Извините, если этот пример неудовлетворительный, мой прецедент гораздо более востребован, и детали будут мешать и сделать гораздо более продолжительное чтение.
Представьте, что у вас есть компонент перезаписи url, который для аргументов имеет некоторые параметры, такие как
- замените этот шаблон на этот шаблон.
- возможно, html cleaner
Если вы хотите вставить этот же компонент с двумя разными правилами замены, но иметь форсунку для очистки html, застряли. Конечно, есть способы обойти это, но им нужны артефакты, которые, конечно, больше кода.
Все правила привязки, к сожалению, относятся к классу, а не к экземпляру, таким образом, каждый раз, когда вы запрашиваете класс, вы возвращаете почти функционально эквивалентный экземпляр.
WELD
Этот вопрос был написан whiel ago, я отказался от Weld.I верю, что он диктует, как его магия делается неправильно. Мне не нравится тот факт, что они диктуют мне, как это происходит, не предоставляя мне способ контролировать, когда и как я могу повторить это действие. Мне не нравится эта негибкость.