マルコスギマラエス:
私が使用しています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
。それがこれを行うことは可能ですか?
雪:
以下からのJavadocのMapBinder
唯一の完全なマップとして後で注入するために、個別に複数のマップ・エントリをバインドするための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
多くの場所で。単一のクラスのために、あなただけのデフォルトを注入し、キーが欠落しているときにそれを使用することができます。
あなただけのマップを使用して別のデフォルトが結合追加しないようにしたい場合は、あなたがあなたのMapBinderに結合第四追加することができます"default"
キーと中get
の方法StringProcessorWrapper
このような何かを:
processorMap.getOrDefault(key, processorMap.get("default"));