Guice: Injecting map binding with @Named

Tags: , ,



I would like to have the following injection model. Is this possible with Guice?

Module:

protected void configure() {
    MapBinder<String, IService> mapBinder = MapBinder.newMapBinder(binder(), String.class, IService.class);
    mapBinder.addBinding("keyA").to(IServiceA.class);
    mapBinder.addBinding("keyB").to(IserviceB.class);
}

Class:

class SomeClass {
    private final IService service;

    @Inject
    SomeClass(@Named("KeyA") final IService serviceInstance) {
        this.service = serviceInstance;
    }
}

Answer

That is not what map binder are intended for. In your example a binding annotation would be the way to go: https://github.com/google/guice/wiki/BindingAnnotations

protected void configure() {
    bind(IServiceA.class).annotatedWith(Names.named("keyA"));
    bind(IServiceB.class).annotatedWith(Names.named("keyB"));
}


Source: stackoverflow