我正在使用MapBinder
将密钥映射到它们各自的实现。现在我有这样的东西:
MapBinder<String, Processor> processor
= MapBinder.newMapBinder(binder(), String.class, Processor.class);
processor.addBinding("a1").to(a1Processor.class).in(Scopes.SINGLETON);
processor.addBinding("a2").to(a2Processor.class).in(Scopes.SINGLETON);
processor.addBinding("a3").to(a3Processor.class).in(Scopes.SINGLETON);
它正在按预期的方式工作。但是现在我正在考虑创建一个DefaultProcessor
并将String
和a2
以外的任何a3
绑定到此DefaultProcessor
。可以这样做吗?
答案 0 :(得分:1)
来自MapBinder
的{{3}}
一个API,用于单独绑定多个地图条目,仅在以后注入 它们是完整的地图。
因此您要问的问题无法通过MapBinder实现。
尽管您可以在Map<String, Processor>
周围编写包装器并使用它。
建议:
@Singleton
class StringProcessorWrapper {
private final Map<String, Processor> processorMap;
private final Processor defaultProcessor;
@Inject
public StringProcessorWrapper(Map<String, Processor> processorMap, @Named("default") Processor defaultProcessor) {
this.processorMap = processorMap;
this.defaultProcessor = defaultProcessor;
}
public Processor get(String key) {
return processorMap.getOrDefault(key, defaultProcessor);
}
}
为此,您必须像这样在guice模块的configure
方法中添加绑定:
bind(Processor.class).annotatedWith(Names.named("default")).to(DefaultProcessor.class).in(Scopes.SINGLETON);
现在,您可以注入StringProcessor
包装器并使用它了。
当您需要在许多地方使用Map
时,此建议很有价值。对于单个类,您只需注入默认值,然后在缺少键时使用它即可。
如果您只想使用地图并避免添加单独的默认绑定,则可以使用"default"
键和get
的{{1}}方法在MapBinder中添加第4个绑定做这样的事情:
StringProcessorWrapper