Как использовать внедрение зависимостей в Scala без Play Framework? - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть опыт разработки веб-приложения с Scala и Play.Play поддерживает Guice "из коробки", поэтому с помощью Play очень легко делать DI.

В настоящее время я работаю над проектом Scala, который не является веб-приложением и не использует Play.Я хочу динамически внедрить объект конфигурации в несколько мест.Как мне это сделать?

Если для DI необходимо использовать какую-то библиотеку, какая библиотека подходит для этой цели?Любой пример кода?Возможно ли реализовать это с простым Scala, не используя никакую внешнюю библиотеку?Когда я гуглю "Scala DI без Play", все результаты с Play.

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 05 апреля 2019

Игра не имеет ничего общего с внедрением зависимости. Он обрабатывается Guice - широко распространенной библиотекой Java DI.

Чтобы понять основные понятия Guice, я рекомендую прочитать этот источник .

1 голос
/ 05 апреля 2019

Мне нравится использовать 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)
0 голосов
/ 05 апреля 2019

Я не уверен, но я думаю, что вы все еще можете использовать

"com.google.inject" % "guice" % "4.2.2"

и реализовать что-то вроде этого.

class Module extends com.google.inject.AbstractModule {
  protected def configure() = {
    // Example Usage:
    bind(classOf[ClassNameToInjected]).asEagerSingleton()
  }
}

Надеюсьволя помогает.

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