在哪里保持guice注射器?

时间:2010-02-01 10:50:50

标签: dependency-injection guice

你有什么建议?

我发现最适合我的解决方案 - 在枚举类中保留注入器和模块。 优点:

  1. 一次创建注射器和模块,
  2. 可以在运行应用程序时使用不同类的注入器(不仅仅是在引导程序中),
  3. 注射器放在一个地方,很容易找到。
  4. 示例:

    import static ru.package.Modules.*;
    
    public enum Injectors {
    
    FOO_INJECTOR(BarModule.module()),
    
    FOO2_INJECTOR(FOO_INJECTOR.injector(),
            Bar2Module.module(), FooModule.module());
    
    private final Injector m_injector;
    
    Injectors (Module... modules) {
        m_injector = Guice.createInjector(modules);
    }
    
    Injectors (Injector parentInjector, Module... modules) {
        m_injector = parentInjector.createChildInjector(modules);
    }
    
    public Injector injector() {
        return m_injector;
    }
    }
    

2 个答案:

答案 0 :(得分:16)

您似乎从根本上误解了依赖注入的工作原理。如果您尝试在代码中的任何位置使用对Injector的引用,而不是引导应用程序的位置,那么您不使用依赖项注入,而是将其用作服务定位器。每当你需要测试一个类时,你就不得不准备一个Injector,而你的类并没有在它们的构造函数中清楚地说明它们的依赖关系(因为谁知道它们会从{{1在某些方法中,如果他们有或可以得到它的引用)。实际上,正如您在此描述的那样使用Injector甚至比这更糟糕:您甚至无法更改配置,即使是测试,因为您的模块已硬编码到枚举中。

通过依赖注入,类仅声明它们的依赖项并允许enum透明地工作(在初始调用之后获取根应用程序对象),以提供所有这些依赖项。这使得在代码中理解,测试和更改功能相对容易。无论如何,我建议更多地了解如何使用DI和Guice ......你真的不应该这样做。

答案 1 :(得分:5)

更大的问题是为什么?

应该没有必要保持Injector,因为一旦注射完成,Injector应该完成并且应该消失。

但是,如果你确实需要Injector,那么你不能简单地说:

@Inject
private Injector injector;

此应用程序是基于Web还是独立?