基本上我的问题归结为如何让这个测试通过:
private static class DefaultModule extends AbstractModule {
@Override protected void configure() {
}
}
private static class ParentModule extends DefaultModule{}
private static class ChildModule extends DefaultModule {}
private static class DependsOnInjector{
@Inject
public Injector depdendency;
}
@Test
public void when_instancing_a_class_that_depends_on_an_injector_it_should_yield_the_most_childish(){
//childish :p
Injector parent = Guice.createInjector(new ParentModule());
Injector child = parent.createChildInjector(new ChildModule());
DependsOnInjector objectWithInjector = child.getInstance(DependsOnInjector.class);
assertThat(objectWithInjector.depdendency).isSameAs(child);
}
但是也许我错过了这一点:堆栈溢出会让你相信做我正在做的事情是一种罪过(引入引用注入器的工厂,当你要求他们做一个时,他们只是转发给你产品),而我正在做的是接近服务定位器,这是一个糟糕的举动。但我看不出有办法解决这个问题。
我有一个名为“可视化”的接口,它有 7 个实现者。当您运行时,根据您的数据集,我们选择一组这些可视化工具来创建和渲染。对于具有 Injector 字段的工厂,我只需添加一个方法
public <TVis extends Visualization> TVis makeVisualization(Class<TVis> desiredVisualizationType){
return injector.getInstance(desiredVisualizationType);
}
我认为让工厂保留 IOC 容器作为字段的唯一选择是拥有 7 个 guice 的辅助注入工厂,每个实现一个,由开关选择。这太恶心了。
这是几个例子之一。我真的只是想要一种获得最本地注射器的好方法。
编辑,澄清:
有很多地方可以方便地将注入器包装在某种解码器中。可视化器是一个实例,但还有更多。感谢您提供有关地图绑定的提示。我现在遇到的问题是我们的可视化器(无论好坏……我怀疑更糟)希望每次我们需要一个时都会被实例化。因此,即使使用地图绑定,我仍然需要将注入器注入到我的可视化解码逻辑类中,不是吗?
关于我有多少模块:我目前有 4 个 guice 模块:一个共享一个,它注册了我的许多大型(真正)单例服务,然后一个用于我们的“托管”UI,然后一个用于我们的“问题设置”UI ,另一个用于我们的“外部工具”UI(实际上还有一个用于我们的测试环境)。后两个 UI 模块的数量是任意的,每个模块都有几个创建得很晚的对象。意思是不使用子模块我相信我会留下几个地图绑定器,每个绑定都在运行时添加到它们(然后,大概是为了内存泄漏,某种删除逻辑)。在我看来,拥有我的(组合!)guice 模块树(阅读:不是继承树!)
感谢您的帮助,并感谢现有的建议。