У меня есть приложение 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 работает в режиме разработки, но в режиме производства вызов Global.Injector = builder.injector()
вызывает циклическую зависимость, поскольку он вызывает модули и привязки, которые требуют инициализации Global.Injector
, но на данный момент он еще не инициализирован.
Я понимаю, что это может быть связано с тем, что в режиме разработки активные синглтоны инициализируются первыми, тогда как в производственном режиме активные синглтоны и обычные синглтоны инициализируются вместе.
- Я правильно понимаю?
- Верен ли мой подход? Как решить проблему в производственном режиме?