当前位置: 首页 > 知识库问答 >
问题:

Guice辅助的注入深入到依赖关系层次结构

巫马瀚漠
2023-03-14

我想引导一系列处理元素,并通过Guice将它们连接在一起。让我们假设以下路径:

  • 接口由类AImpl实现的需要一些输入
  • 接口B类BImpl实现需要A
  • 接口C类CImpl实现需要B
  • 接口D类DImpl实现需要C

的依赖关系只能在运行时解决,而不能在配置时解决。通常的方法是在这种情况下使用辅助注入来创建工厂,该工厂将缺少的实例作为参数,如下所示:

public interface AFactory {
    public A createA(String input);
}

但我真正想要的是这样的:

public interface DFactory {
    public D createD(String inputForA);
}

我不想在整个层次结构中手动传递AImpl的特定依赖项。使用Guice可以实现这一点吗?如果没有,在保持注射的好处的同时,优雅地规避这个问题的最佳方法是什么?

共有2个答案

傅鸿波
2023-03-14

我有三种选择。它们取决于您更改A输入的频率。

1) 将输入绑定为模块中的常量。只有在创建喷油器之前知道该值且不想更改该值时,此操作才有效。请参见bindConstant

2) 使用一个私有子模块,该子模块可以在该模块内绑定a或输入的值。基本上,可以有两个或三个具有不同值的实例图。请参阅newPrivateBinder。

3) 使用作用域ala、会话作用域。。。这样,您可以经常更改输入,但必须在某个待定义的点输入/离开范围。有关示例,请参见自定义范围。

闻人越
2023-03-14

作弊方式:将输入粘贴在静态变量或单例ThreadLocal中。在管道开始之前设置它,结束后清除它。通过DI绑定其他所有内容。

奇特的方式:在A中,请参阅A PipelineInput String inputString,但不要将其绑定到主注入器中。否则,请像通常那样绑定依赖项,包括在其他与管道相关的类中引用PipelineInput。当您确实需要一个D时,请从您的D工厂实现中获取它,我称之为PipelineRunner。

public class PipelineRunner {
  @Inject Injector injector; // rarely a good idea, but necessary here

  public D createD(final String inputForA) {
    Module module = new AbstractModule() {
      @Override public void configure() {
        bindConstant(inputForA).annotatedWith(PipelineInput.class);
      }
    };
    return injector.createChildInjector(new PipelineModule(), module)
        .getInstance(D.class);
  }
}

自然,ABCD的绑定尝试将在PipelineRunner之外失败,因为缺少@PipelineInput String-当您创建具有这些未满足依赖项的注入器时,您会得到CreationException,正如您所发现的那样-但是这些基于管道的依赖项应该很容易分离为您安装到子注入器中的模块。

如果这感觉太粗糙,请记住PrivateModules也是“使用父注入器实现的”,依赖注入的整个要点是以解耦的方式使整个对象图可以使用像inputForA这样的依赖。

 类似资料:
  • 我在用Guice辅助注射。下面是一个标准场景: 现在,我可以使用Guice factory调用,并通过Guice注入的实例轻松获得我的实例。 我的问题是:如果我希望引用正在创建的的实例,该怎么办?换句话说,我想要: 我当前的解决办法相当难看:我手动创建了一个,而不使用,然后使用获取实例,并在实例上调用方法。啊!

  • 我有一个工厂是这样的: 这样的类: 如何正确使用Google Guice来做同样的事情?我尝试了辅助注射,但我不确定如何创建“UrlBuilder”。谁能帮忙?

  • 我喜欢在构造函数中传递运行时依赖项的主要原因是: 它使依赖关系成为必需的 它提供了设置实例变量的中心位置 将依赖项设置为实例变量,可以避免在类中从一个方法传递到另一个方法,或者将它分两次或多次传递给两个或更多个公共方法 这导致我在使用Guice时使用了很多辅助注射。与不使用DI相比,这会产生额外的代码,因此阅读以下内容:辅助注入到底有多有用? 似乎大多数人不会使用辅助注入在构造函数中传递运行时(派

  • 我正在使用Guice Assisted Inject库为我建立一个工厂。我目前的设置如下: 这迫使我使用< code > factory . create controller(first,factory . create second(first))显式创建一个< code>SecondDep。是否可以更改我的绑定,这样我就可以简单地执行< code > factory . create con

  • 我一直在用guice做一个项目。 我有一个抽象类,它有很多实现。为了使用正确的实现,我使用一个工厂,它接收参数,然后返回正确的实例。 演示代码 我想知道的是,如果我可以用替换工厂,直接注入的实现(请注意,它们应该使用辅助注入)? 谢谢你。

  • 我是Guice的新手,正在尝试在下面的类族中实现依赖注入,如下所示: 然而,有一些问题,由于我的请求没有成功。 您能否帮助我发现问题,并让我知道您是如何调试Guice中的依赖注入问题的?