Можно ли внедрить реализации для произвольных типов с помощью Guice? - PullRequest
1 голос
/ 20 июня 2019

My Issue

Я мигрирую из Tapestry IOC в Guice и хотел бы, чтобы Guice перенаправил все неразрешенные запросы на инъекцию Tapestry IOC.Это работает в отдельном случае, например:

 bind(DSLContext::class.java).toProvider (Provider {
        tapestryRegistry.getService(DSLContext::class.java)
  })

При этом, когда Guice запрашивают DSLContext, он берет экземпляр, созданный с помощью гобелена, из реестра гобеленов.

Мой вопрос

Я хотел бы сделать это в общем, что-то вроде Provider.get (), за исключением того, что это должен быть Provider.get (Class).Как я могу сделать это с Guice?

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Я никогда не делал этого, так что это, вероятно, плохой ответ, но вы можете использовать https://github.com/google/guice/wiki/CustomInjections, где вы:

Реализация TypeListener для проверки инжектора для типа поляиметь привязку guice вместо того, чтобы смотреть на их аннотацию, как в примере.(пример проверяет наличие @injectlogger в поле) вам нужно проверить инжектор на наличие привязки

Реализуйте инжектор members, чтобы установить значение поля из гобелена, а не создавать объект самостоятельно.(пример создает и устанавливает новый экземпляр средства ведения журнала)

Когда вы связываете слушателя, вам нужно будет связываться с экземпляром, предоставляя экземпляр инжектора и гобелена.

0 голосов
/ 21 июня 2019

Итак, я понял, что могу использовать сервис Tapestry «Service Activity Scoreboard», чтобы выяснить, какие сервисы связаны с Tapestry IOC.

tapestryRegistry.getService(ServiceActivityScoreboard::class.java)
.serviceActivity.forEach { serviceActivity ->

        bindOnce(serviceActivity.serviceInterface)?.toProvider( Provider {
            tapestryRegistry.getService(serviceActivity.serviceInterface)
        })

}

bindOnce - это просто локальный метод модуля, который обеспечивает интерфейсне связаны дважды.

...