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