5

你有什么建议?

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

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

例子:

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;
}
}
4

2 回答 2

17

您似乎从根本上误解了依赖注入的工作原理。如果您尝试使用对Injector代码中除引导应用程序的位置之外的任何位置的引用,则您没有使用依赖注入,而是将其用作服务定位器。Injector每当你需要测试一个类并且你的类没有在它们的构造函数中明确说明它们的依赖关系是什么时,你Injector不得不准备得到它的参考)。实际上,使用enum你在这里描述的更糟糕:你根本无法更改配置,即使是为了测试,因为你的模块被硬编码到枚举中。

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

于 2010-02-01T14:53:55.707 回答
6

更大的问题是为什么?

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

但是,如果您真的需要 ,您Injector不能简单地:

@Inject
private Injector injector;

这个应用程序是基于网络的还是独立的?

于 2010-02-01T11:51:05.660 回答