私は自分のコードでこれを持てるようにしようとしています
@Inject
private Map<String, Provider<Processor>> providers;
私は試していましたが、このコードはコンパイルされません
MapBinder<String, Provider<Processor>> mapbinder = MapBinder.newMapBinder(binder, String.class, Provider<Processor>.class);
mapbinder.addBinding("splineV1Beta").to(SplineProcessor.class);
mapbinder.addBinding("invertV1Beta").to(InvertProcessor.class);
このコードは、マップをバインドできないため、起動時に失敗します
MapBinder<String,Processor> mapbinder = MapBinder.newMapBinder(binder, String.class, Processor.class);
mapbinder.addBinding("splineV1Beta").to(SplineProcessor.class);
mapbinder.addBinding("invertV1Beta").to(InvertProcessor.class);
ここでバインディングを正しくセットアップするにはどうすればよいですか?
注: 私も何か簡単なものを探しているので、開発者は新しいプロセッサを入手するたびに 1 行追加するだけです. TypeLiteral および toProvider() メソッドを使用して、上記に加えて他のことも試しました)。
詳細情報: 以下の行があるかどうかわかりました (ただし、addBinding はまったく呼び出さないでください)
Provider<? extends Provider<Processor>>
//This below line ends up with mabbinder2.addBinder().to() wanting the above param type?
MapBinder<String, Provider<Processor>> mapbinder2 = MapBinder.newMapBinder(binder, stringLit, list);
私の考えを根本的に変えて、私はこのようなものを注入しようとします( map.get("xxx") が毎回新しいインスタンスを作成することを願っています...
@Inject
private Map<String, Processor> providers;
このようにバインドしましたが、残念ながら、マップは常に同じインスタンスを返します:(...
MapBinder<String, Processor> mapbinder = MapBinder.newMapBinder(binder, String.class, Processor.class);
mapbinder.addBinding("splineV1Beta").toProvider(new TypeLiteral<Provider<SplineProcessor>>() {;});
mapbinder.addBinding("invertV1Beta").toProvider(new TypeLiteral<Provider<InvertProcessor>>() {;});
編集: このドキュメントhttp://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/MapBinder.htmlによると、
MapBinder<String, Snack> and inject a Map<String, Provider<Snack>>
しかし、(プライベートフィールドを使用して)それを行うと、次のようになります....(一方、他のソリューションに変更してもmapbinder.addBindingを呼び出さないと、バインドされて正常に動作します)...
1) No implementation for java.util.Map<java.lang.String,
javax.inject.Provider<controllers.modules2.framework.Processor>> was bound.
これが彼らの例のように機能するには、コンストラクター注入を使用する必要がありますか? 私は抽象クラスにいるので、10個のクラスを変更するのは非常に不便です:(。
ありがとう、ディーン