guice multibinder z dostawcami

Próbuję mieć to w moim kodzie

@Inject
private Map<String, Provider<Processor>> providers;

Próbowałem, ale ten kod się nie kompiluje

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);

Ten kod nie działa podczas uruchamiania, ponieważ nie może powiązać mojej mapy

MapBinder<String,Processor> mapbinder = MapBinder.newMapBinder(binder, String.class, Processor.class);
mapbinder.addBinding("splineV1Beta").to(SplineProcessor.class);
mapbinder.addBinding("invertV1Beta").to(InvertProcessor.class);

Jak poprawnie skonfigurować powiązania?

UWAGA: Szukam czegoś prostego, więc programiści po prostu dodają jedną linię za każdym razem, gdy mamy nowy procesor (mam nadzieję, że nie muszę dodawać ani jednej linii + jakiegoś interfejsu fabrycznego ... powinien być sposób, ale ja wypróbowałem także inne rzeczy oprócz powyższego, również metody TypeLiteral i toProvider ().

WIĘCEJ INFORMACJI: okay, dowiedziałem się, czy mam poniższy wiersz (ale nie dzwonię do addBinding w ogóle) Guice faktycznie uruchomi się, co jest dobre, ale wszystkie podpisy addBinding (). Do metody są teraz błędne, ponieważ chcą

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);

RADICALLY zmienia moje myślenie i próbuję wstrzyknąć coś takiego (mając nadzieję, że map.get ("xxx") tworzy nowe instancje za każdym razem ...

@Inject
private Map<String, Processor> providers;

i związałem to tak, ale niestety mapa zawsze zwraca tę samą instancję: (...

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>>() {;});

EDIT: zgodnie z tym dokumentemhttp://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/MapBinder.html możesz mieć

 MapBinder<String, Snack> and inject a Map<String, Provider<Snack>>

ale kiedy to robię (z polem prywatnym), otrzymuję następujące .... (podczas gdy gdy zmieniam na inne rozwiązanie, ale nie wywołuję mapbinder.addBinding, wiąże i działa dobrze) ...

1) No implementation for java.util.Map<java.lang.String,    
javax.inject.Provider<controllers.modules2.framework.Processor>> was bound.

Czy muszę użyć wtrysku konstruktora, aby działał jak ich przykład? Jestem w klasie abstrakcyjnej, więc zmiana 10 klas byłaby bardzo niewygodna :(.

dzięki, Dean

questionAnswers(2)

yourAnswerToTheQuestion