Я все еще в начале изучаю scala в дополнение к java, и я не понял, как он должен делать DI там? может или я должен использовать существующую библиотеку DI, если это нужно сделать вручную или есть другой способ?
Как сделать инъекцию зависимостей в scala?
Ответ 1
Стандартные рамки Java DI обычно работают с Scala, но вы также можете использовать языковые конструкции для добиться того же эффекта без внешних зависимостей.
Ответ 2
Новая библиотека инъекций зависимостей специально для Scala - Dick Wall SubCut.
В то время как статья Джонаса Бонера, упоминаемая в ответе Dan Story, подчеркивает, что экземпляры, связанные с временем компиляции, и статическая инъекция (через mix-ins), SubCut основан на инициализации времени выполнения неизменяемых модулей и динамической инъекции путем запроса связанных модулей по типу, имена строк или имена scala.Symbol.
Подробнее о сравнении с шаблоном Cake вы можете прочитать в документе GettingStarted.
Ответ 3
Зависимость Впрыскивание может выполняться без поддержки любого инструмента, каркаса или контейнера. Вам нужно только удалить new
из вашего кода и перенести их в конструкторы. Единственной утомительной частью, которая остается, является проводка объектов в "конце света", где контейнеры очень помогают.
Хотя с макросами Scala 2.10 вы можете генерировать код подключения во время компиляции и иметь автоматическую проводку и безопасность типов.
Ответ 4
Я сам этого не делал, но большинство фреймворков DI работают на уровне байт-кода (AFAIK), поэтому их можно использовать с любым языком JVM.
Ответ 5
Недавний проект иллюстрирует DI, основанный исключительно на инжекции конструктора: zalando/grafter
Что случилось с заменой конструктора снова?
Есть many библиотеки или подходит для инъекции зависимостей в Scala. Grafter восходит к основам инъекции зависимостей, просто используя инъекцию конструктора: отсутствие отражения, отсутствие xml, отсутствие аннотаций, отсутствие наследования или самонаведения.
Затем Grafter добавляет к инсталляции конструктора только необходимую поддержку:
- создать компонентное приложение из конфигурации
- тонкая настройка проводки (создание синглонов)
- проверить приложение, заменив компоненты
- запустить/остановить приложение
Grafter нацеливается на все возможные приложения, поскольку он фокусируется на объединении только трех идей:
- классы и интерфейсы для компонентов
- Примеры чтения и бесформенные для конфигурации
- переписывание дерева и kiama для всего остального!
Ответ 6
В дополнение к ответу Dan Story, я писал о варианте DI, который также использует только языковые конструкции, но не упоминается в почте Jonas: Value Injection on Черты характера. Этот шаблон работает очень хорошо для меня.
Ответ 7
Я показал, как я создал очень простой функциональный контейнер DI в scala, используя здесь 2.10 .
Ответ 8
Предыдущие должности охватывали методы. Я хотел добавить ссылку на Мартина Одерски в мае 2014 года по языковым целям Scala. Он идентифицирует языки, которые "требуют" контейнера DI для инъекций зависимостей, как плохо реализованных. Я согласен с этим лично, но это всего лишь мнение. Кажется, это указывает на то, что включение зависимостей DI в вашем проекте Scala не является идиоматическим, но опять же это мнение. Практически говоря, даже с языком, предназначенным для инъекции зависимостей изначально, существует определенная степень согласованности, полученная при использовании контейнера. Стоит рассмотреть обе точки зрения для ваших целей.