Как сделать инъекцию зависимостей в scala?

Я все еще в начале изучаю scala в дополнение к java, и я не понял, как он должен делать DI там? может или я должен использовать существующую библиотеку DI, если это нужно сделать вручную или есть другой способ?

Ответ 1

Стандартные рамки Java DI обычно работают с Scala, но вы также можете использовать языковые конструкции для добиться того же эффекта без внешних зависимостей.

Ответ 2

Новая библиотека инъекций зависимостей специально для Scala - Dick Wall SubCut.

В то время как статья Джонаса Бонера, упоминаемая в ответе Dan Story, подчеркивает, что экземпляры, связанные с временем компиляции, и статическая инъекция (через mix-ins), SubCut основан на инициализации времени выполнения неизменяемых модулей и динамической инъекции путем запроса связанных модулей по типу, имена строк или имена scala.Symbol.

Подробнее о сравнении с шаблоном Cake вы можете прочитать в документе GettingStarted.

Ответ 3

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

Хотя с макросами Scala 2.10 вы можете генерировать код подключения во время компиляции и иметь автоматическую проводку и безопасность типов.

См. Включение зависимостей в Scala Guide

Ответ 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 не является идиоматическим, но опять же это мнение. Практически говоря, даже с языком, предназначенным для инъекции зависимостей изначально, существует определенная степень согласованности, полученная при использовании контейнера. Стоит рассмотреть обе точки зрения для ваших целей.

https://youtu.be/ecekSCX3B4Q?t=1154