guice multibinder com provedores

Eu estou tentando ser capaz de ter isso no meu código

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

Eu estava tentando, mas este código não compila

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

Esse código falha na inicialização porque não pode vincular meu mapa

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

Como faço para configurar as ligações corretamente aqui?

NOTA: Estou procurando algo fácil também, então os desenvolvedores apenas adicionam uma linha toda vez que temos um novo processador (espero não ter que adicionar uma linha + alguma interface de fábrica ... deve ser uma maneira, mas eu tentei outras coisas além de acima com o método TypeLiteral e toProvider () também).

MAIS INFO: ok, eu descobri se eu tenho a linha abaixo (mas não chamo addBinding) Guice irá realmente inicializar o que é bom, mas todas as assinaturas de método addBinding () para agora estão erradas como elas querem

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

RADICAMENTE mudar meu pensamento e eu tento injetar algo assim (esperando que map.get ("xxx") cria novas instâncias de cada vez ...

@Inject
private Map<String, Processor> providers;

e liguei assim, mas infelizmente, o mapa está sempre retornando a mesma instância: (...

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: de acordo com este documentohttp://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/MapBinder.html você pode ter um

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

mas quando eu faço isso (com um campo privado), eu recebo o seguinte .... (enquanto que quando eu mudo para a minha outra solução, mas não chamo mapbinder.addBinding, ele liga e funciona muito bem) ...

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

Eu tenho que usar injeção de construtor para isso funcionar como o exemplo deles? Eu estou em uma classe abstrata, de modo que seria muito inconveniente para alterar 10 classes :(.

obrigado, Dean

questionAnswers(2)

yourAnswerToTheQuestion