可以使用Guice注入任意类型的实现吗?

时间:2019-06-20 14:37:33

标签: guice tapestry

我的问题

我正在从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 个答案:

答案 0 :(得分:1)

我从未做过,所以这可能是一个错误的答案,但是您可以在其中使用https://github.com/google/guice/wiki/CustomInjections

使用TypeListener来测试注入器是否具有guice绑定的字段类型,而不是像示例一样查看它们的注释。 (例如在字段中检查@injectlogger的示例),您需要检查注射器是否具有约束力

实施成员注入器以从挂毯中设置字段值,而不是自己创建对象。 (示例创建并设置了一个新的记录器实例)

在绑定侦听器时,您必须在提供注射器和挂毯实例的同时绑定到实例。

答案 1 :(得分:0)

因此我发现可以使用Tapestry的“服务活动记分板”服务来确定哪些服务绑定到Tapestry IOC。

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

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

}

bindOnce这里只是一个模块本地方法,可确保接口未绑定两次。