Мне нравится использовать Macwire .
Настройка
Добавьте эту строку в build.sbt
файл:
libraryDependencies += "com.softwaremill.macwire" %% "macros" % "2.3.2" % Provided
и затем перезагрузите.
Обратите внимание, что область действия Provided
, поэтому она не добавляет никаких накладных расходов во время выполнения. Он использует макросы для выполнения своей работы во время компиляции. Это означает, что вы получаете инъекцию зависимости во время компиляции, и если вам не хватает зависимости, вы обнаружите ее как можно скорее - с ошибкой во время компиляции, а не получите исключение времени выполнения.
Пример кода
- Давайте определим две службы, X и Y, с некоторыми зависимостями, A, B и C, чтобы мы могли использовать их позже:
case class A()
case class B()
case class C()
case class X(a: A, b: B)
case class Y(c: C)
- Теперь давайте свяжем наши зависимости в конце света (рядом с основной функцией):
import com.softwaremill.macwire._
lazy val a = wire[A]
lazy val b = wire[B]
lazy val c = wire[C]
lazy val x = wire[X]
lazy val y = wire[Y]
- Компилятор переведет приведенный выше код в следующий код:
lazy val a = new A()
lazy val b = new B()
lazy val c = new C()
lazy val x = new X(a, b)
lazy val y = new Y(c)
Это в основном реализация с простым кодом Scala, как вы и просили в своем посте.
Изменение зависимостей
Здесь хорошо то, что когда одна из служб изменяется путем добавления / удаления зависимости, ваш код подключения останется прежним.
Например, давайте изменим службу Y, чтобы она также требовала зависимости B в качестве зависимости.
- Наши службы и зависимости будут выглядеть так:
case class A()
case class B()
case class C()
case class X(a: A, b: B)
case class Y(b: B, c: C)
lazy val a = new A()
lazy val b = new B()
lazy val c = new C()
lazy val x = new X(a, b)
lazy val y = new Y(b, c)