Я пытаюсь использовать DI-часть Micronaut в каком-то проекте, который не является обычной ... игрой. Я заменил дерьмовый DI игрового фреймворка на аннотации BeanContext и JSR 330, и теперь я намного счастливее. За исключением ...
(Предупреждение: псевдокод вперед)
Есть некоторые бины, которые я не могу создать как @Singleton
или @Context
, потому что они зависят от некоторых графических классов которые должны быть инициализированы игровой средой. Допустим, все root бинов моего дерева являются подклассами Screen
и имеют параметр типа Graphics
.
Я хочу иметь возможность делать что-то вроде
fun onOpenGlReady(graphics : Graphics) {
beanContext.registerScope(GraphicsScope(graphics)) // I know this method is made up...
// An alternative would be to inject here a GraphicsScope singleton and do something like
// graphicsScope.setGraphics(graphics)
beanContext.getBeansOfType(Screen::class.java).forEach(gameEngine.register(it))
gameEngine.run(beanContext.getBean(Screen::class.java, Primary::class.java).getJavaClass())
}
с GraphicsScope
реализацией CustomScope<GraphicsBean>
и моими экранами и некоторыми их зависимостями, помеченными @GraphicsBean
.
(Почему я просто не запрашиваю какие-либо bean-компоненты типа Screen
до этого момента? Потому что у меня есть другие экраны, которые не зависят от Graphics
, и они мне нужны для начальной загрузки ...)
Чтобы поиграть с этим, следуйте некоторому случайному предложению в блоге и просматривая RequestScope
из https://github.com/micronaut-projects/micronaut-core/pull/1626, я аннотировал свой GraphicsScope
(с большинством методов, являющихся черновиками, просто для отладки приложения и просмотра того, что я получаю) с @Singleton
, но он просто никогда не вызывается.
@Singleton
class GraphicsScope : CustomScope<GraphicsBean>, LifeCycle<GraphicsScope> {
override fun annotationType(): Class<AssetsUser> {
return GraphicsBean::class.java
}
override fun <T : Any?> remove(identifier: BeanIdentifier?): Optional<T> {
TODO("Not yet implemented")
}
override fun <T : Any?> get(resolutionContext: BeanResolutionContext?, beanDefinition: BeanDefinition<T>?, identifier: BeanIdentifier?, provider: Provider<T>?): T {
TODO("Not yet implemented")
}
override fun isRunning(): Boolean = true
Кроме того, вызов
beanContext.getBean(GameScreen::class.java)
, где GameScreen
помечен @GraphicsBean
, просто выдает NoSuchBeanException
.
с другими библиотеками DI, такими как Toothpick, такого рода добавление подскопов тривиально, но им не хватает более продвинутых функций. ike фабрики или получение всех бобов, которые наследуются от суперкласса.
Чего я тут не понимаю?