Guice覆盖现有注入器中的一些绑定

时间:2014-01-24 17:24:56

标签: dependency-injection guice

我有一个Injector实例a,我想创建另一个与Injector b相同的a,除了两个绑定,它们被覆盖我提供的Module。这可能吗?

我知道Modules.override,但这不会以Injector为参数。如果可以将Injector转换为Module,则可以解决我的问题。

1 个答案:

答案 0 :(得分:1)

最简单的思考方式是child injectors,但那是explicitly disallowed as a design decision

  

不支持覆盖子注入器中绑定的原因是因为它可以引导开发人员编写可以在父代和母版中工作的代码。儿童注射器,但每个都有不同的行为。这可能导致非常令人惊讶的情况,因为即时(JIT)绑定以及它们与父/子注入器的交互方式。

此时,我可能会考虑重构您的应用程序以避免需要这些复杂的绑定,但如果您想要更进一步,您可以使用Injector.getBindings()Injector.getAllBindings()(注意区别! )并使用Elements SPI将它们缝合回模块。毕竟,Binding<?>扩展了Element,而Elements.getModule(...)将从您的元素中创建一个模块。我没有检查它是否有效,但这可能是你最好的领导。