Guiceの - デフォルトはMapBinderバインディング

マルコスギマラエス:

私が使用しています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それがこれを行うことは可能ですか?

雪:

以下からのJavadocMapBinder

唯一の完全なマップとして後で注入するために、個別に複数のマップ・エントリをバインドするための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"));

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=236497&siteId=1