Пользовательская область в Micronaut не вызывается - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь использовать 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 фабрики или получение всех бобов, которые наследуются от суперкласса.

Чего я тут не понимаю?

...