У меня есть приложение 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 готовые синглтоны и обычные синглтоны инициализируются вместе.
- Правильно ли я понимаю?
- подход действителен? Как решить проблему в производственном режиме?