要回答您的第一个问题,您可以通过添加显式来获得所需的注射器 bind(DependsOnInjector.class); 至 ChildModule 。除此以外, ” 尽可能在祖先注射器中创建为子注射器创建的即时绑定 “。
bind(DependsOnInjector.class);
ChildModule
我有一个名为“可视化”的界面,它有7个实现者。 当您运行时,根据您的数据集,我们选择一组这些 用于创建和呈现的可视化工具。
如果您的可视化器集是固定的,请考虑使用plain 绑定注释 。这是用于区分同一接口的多个实现的最简单方法。您不需要多个喷射器。
如果您的可视化工具集不是固定的(例如,这些可视化工具是插件),那么您的任务将被整齐地解决 MapBinder 。有了它你也不需要多个注射器,你可以定义所有的注射器 Visualization s单喷射器内:
MapBinder
Visualization
public class VisualizationsModule extends AbstractModule { @Override protected void configure() { MapBinder<Class<Visualization>, Visualization> binder = MapBinder.newMapBinder(binder(), new TypeLiteral<Class<Visualization>>() {}, TypeLiteral.get(Visualization.class)); binder.addBinding(Visualization1.class).to(Visualization1.class); binder.addBinding(Visualization2.class).to(Visualization2.class); // etc } }
然后你可以注射一个 Map<Class<Visualization>, Visualization> :
Map<Class<Visualization>, Visualization>
@Inject public SomeClass(Map<Class<Visualization>, Visualization> visualizers) { ... }
您不仅可以选择任意键 Class<Visualizer> ,这取决于您的业务需求。如果可视化器是插件,您应该使用某种插件标识符作为键。
Class<Visualizer>
如果您只想在运行时获取正确的实例,为什么不能只添加一个 @Provides 模块实例化的方法 Visualization S'
@Provides