Разница между режимами Dev и Prod в порядке инициализации модулей внедрения зависимостей - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть приложение Play, и я использую библиотеки Play для DI, с Guice из коробки.

Некоторые из модулей воспроизведения, которые я определяю, зависят друг от друга и в порядкечтобы они могли внедрять свои привязки в другом, я пытаюсь сохранить ссылку на инжектор Play в глобальном месте, то есть

class MyApplicationLoader extends GuiceApplicationLoader() {
  override def builder(context: ApplicationLoader.Context): 
    GuiceApplicationBuilder = {
    val builder = super.builder(context)
    Global.Injector = builder.injector()
    builder
  }
}

. Это хорошо работает, когда Play работает в режиме Dev, нов производственном режиме вызов Global.Injector = builder.injector() вызывает циклическую зависимость, потому что он вызывает модули и привязки, которые должны быть инициализированы Global.Injector, но это еще не было инициализировано.

Я понимаю, что это может быть связанок тому факту, что в режиме Dev инициализируемые синглтоны инициализируются первыми, тогда как в режиме Production готовые синглтоны и обычные синглтоны инициализируются вместе.

  1. Правильно ли я понимаю?
  2. подход действителен? Как решить проблему в производственном режиме?

1 Ответ

1 голос
/ 08 ноября 2019

Я пытаюсь сохранить ссылку на инжектор Play в Глобальном месте

В большинстве случаев это не нужно, и вам следует избегать этого.

Для решения вашей проблемы, похоже, вам нужно использовать только аннотацию Обеспечивает , простой пример такой:

class MyModule extends AbstractModule {
  @Provides
  def complexConstructor(a: ObjA, b: ObjB): ComplexClass = ???
}

При таком подходе не должно быть проблем.

...