Как сделать инъекцию зависимости в scala? - PullRequest
74 голосов
/ 02 апреля 2010

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

Ответы [ 8 ]

59 голосов
/ 02 апреля 2010

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

14 голосов
/ 06 сентября 2011

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

Дика Уолла.

Принимая во внимание, что в статье Jonas Bonér, на которую есть ссылка в ответе Дана Стори, особое внимание уделяется экземплярам с привязкой во время компиляции и статическому внедрению (через добавления), в основе SubCut лежит инициализация неизменяемых модулей во время выполнения и динамическое внедрение путем запроса связанных модулей по типу, имена строк или имена символов.

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

9 голосов
/ 11 апреля 2013

Внедрение зависимостей само по себе может быть выполнено без какого-либо инструмента, каркаса или поддержки контейнера. Вам нужно только удалить new s из вашего кода и переместить их в конструкторы. Одна утомительная часть, которая остается, - это подключение объектов на «конце света», где контейнеры очень помогают.

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

См. Внедрение зависимостей в Scala Guide

2 голосов
/ 24 декабря 2016

Недавний проект иллюстрирует DI, основанный исключительно на инжекторе конструктора: zalando / grafter

Что опять не так с инжекцией в конструктор?

Существует много библиотек или подходит для выполнения внедрения зависимостей в Scala. Grafter возвращается к основам внедрения зависимостей с помощью , просто используя внедрение конструкторов : без отражения, без XML, без аннотаций, без наследования или самоподтипов.

Затем Grafter добавляет в конструктор инъекцию только необходимую поддержку:

  • создание приложения на основе компонентов из конфигурации
  • Точная настройка проводки (создание синглетонов)
  • протестировать приложение, заменив компоненты
  • запуск / остановка приложения

Grafter нацелен на все возможные приложения, потому что фокусируется на объединении всего 3 идей:

  • case-классы и интерфейсы для компонентов
  • Считыватели экземпляров и бесформенные для конфигурации
  • переписывание деревьев и kiama для всего остального!
1 голос
/ 12 сентября 2016

Предыдущие посты посвящены технике. Я хотел добавить ссылку на выступление Мартина Одерского в мае 2014 года о целях языка Scala. Он определяет языки, которые «требуют» контейнера DI для внедрения зависимостей, как плохо реализованные. Я согласен с этим лично, но это только мнение. Кажется, это указывает на то, что включение зависимости DI в ваш проект Scala не является идиоматическим, но опять же это мнение Практически говоря, даже с языком, разработанным для естественного внедрения зависимостей, при использовании контейнера достигается определенная согласованность. Стоит рассмотреть обе точки зрения для ваших целей.

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

1 голос
/ 02 апреля 2010

Я сам этого не делал, но большинство DI-фреймворков работают на уровне байт-кода (AFAIK), поэтому их можно использовать с любым языком JVM.

0 голосов
/ 08 марта 2013

Я показал, как я создал очень простой функциональный DI-контейнер в Scala, используя 2,10 здесь.

0 голосов
/ 15 января 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...