【问题标题】:Guice bind().toInstance() injects already injected members?Guice bind().toInstance() 注入已经注入的成员?
【发布时间】:2016-05-22 16:34:10
【问题描述】:

我在一个多模块项目中有多个注入器,并且想将一个已经注入的实例从模块 A 传递到另一个 Guice 模块 B:

//module B    
bind(DeleteEmployeeUseCaseFactory.class).toInstance(useCaseFactories);
//usecaseFactories comes from module A, and already injected

但是,这会导致模块 B 中出现绑定异常,因为 guice 会尝试在未绑定这些依赖项的模块 B 中重新注入“usecaseFactories”成员。

为什么 guice 会尝试注入给定实例的成员,以及如何避免这种情况?

【问题讨论】:

  • 你能发布更多关于异常的信息吗?尽管手动管理多个注射器(与创建子注射器相比)很少见,但我认为您所描述的内容不应该起作用。请记住,模块和注入器是不同的东西,Guice 不关心模块依赖关系,它关心注入器依赖关系。
  • 谢谢,我的问题和这里描述的完全一样:github.com/google/guice/issues/751。模块是分开的,因为它们封装了它们内部的 DI 行为,只是通过接口(在本例中为 useCaseFactories)进行通信。也许不是最好的设计,但我没有一个例子可以在保持模块独立和干净的同时使用子注入器。
  • 但是我用 Providers.of(..) 解决了我的问题。
  • 听起来是一个很好的解决方案!我学到了一些新东西。您可能希望链接到大型自动注入 wiki 页面作为自我回答。

标签: java guice guice-3


【解决方案1】:

我解决了通过使用 Provider 来避免注入实例的已注入成员:

bind(DeleteEmployeeUseCaseFactory.class).toProvider(Providers.of(useCaseFactories));

然而,正如here 所述,这是 guice 的预期行为:

自动注入

Guice 自动注入以下所有内容:

  • 在绑定语句中传递给 toInstance() 的实例
  • 在绑定语句中传递给toProvider() 的提供程序实例 对象将在注入器本身被创建时被注入。如果需要满足其他启动注入,Guice 会在使用前注入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2012-08-10
    • 2017-05-28
    • 2016-09-04
    • 1970-01-01
    • 2021-03-04
    • 2015-04-17
    相关资源
    最近更新 更多