Переключение между Spring, Guice, Weld или другими реализациями DI

Я пишу фреймворк, где другие команды разрабатывают приложения.

Я хочу предоставить Dependency Injection как часть этого. Я делаю, чтобы разработчики использовали аннотации JSR 330, и мой фреймворк может работать на DI.

Тем не менее у меня есть следующая проблема

Разработчик должен написать модуль, если я использую Guice, beans.xml, если я использую WELD. Это сочетает конкретный DI с моим кодом приложения для разработчиков. Я хочу переключить базовую инъекцию зависимостей в фреймворк, не касаясь кода приложения.

Есть ли способ сделать это?

2 ответа

Решение

Если вы строго придерживаетесь функций JSR330, можно предоставить фреймворк фреймворка, который может использоваться всеми тремя упомянутыми вами реализациями DI-фреймворков. Чтобы позволить CDI сканировать модуль, вы должны предоставить bean.xml, но я бы не назвал этот код инвазивным.

Если вам нужно нечто большее, чем просто JSR330, например, модули, фабрики, методы продюсера, автоконфигурации,... вы можете предложить собственные модули расширения, так что у вас есть "myframework-core" для материалов, не зависящих от реализации, и "myframework-guice" "кроме того, предоставляя помощников и модулей для подсказок и так далее.

Я не думаю, что JSR-330 обладает достаточной информацией о том, как система запускается, чтобы она была действительно переключаемой. Например, если вы используете Guice, вам нужно создать Injector. Если вы используете Spring, вам нужно будет использовать его JavaConfig. Если вы используете HK2, вам нужно будет использовать либо обычный генератор, либо использовать модули. Если вы используете CDI, вам нужен только файл beans.xml (а в более позднем CDI он вам даже не нужен), но вы почти наверняка обнаружите, что вам нужны другие функции CDI, такие как Producers.

Я думаю, что JSR-330 слишком мал, чтобы быть переносимым по этим причинам.

Другие вопросы по тегам