Vous avez plusieurs options ici.
1. puisque vous utilisez un enum
pour distinguer entre les implémentations, alors vous avez un nombre fini d'implémentations que vous pouvez définir chacun avec leur propre liaison, à condition que vous utilisez une annotation lors de l'injection
public @interface SomeInterfaceKind {
MyObjects value();
}
dans votre Module
:
bind(SomeInterface.class)
.annotatedWith(new SomeInterfaceKindImpl(MyObjects1.OBJECT1)
.to(Object1.class);
...
ensuite dans les classes à injecter:
@Inject void setSomeInterface(
@SomeInterfaceKind(MyObjects.OBJECT1) SomeInterface object) {...}
Ici, vous devez définir SomeInterfaceKindImpl
classe qui implémente SomeInterfaceKind
(oui, il est possible d'étendre une annotation!) Pour plus de détails, jetez un oeil à la façon dont Named
est mis en œuvre en Guice.
2. Vous pouvez également utiliser Guice MapBinder comme suit (je trouve plus simple à mettre en œuvre)
Dans votre module:
MapBinder.newMapBinder(MyObjects.class, SomeInterface.class)
.addBinding(MyObjects.OBJECT1).to(Object1.class);
MapBinder.newMapBinder(MyObjects.class, SomeInterface.class)
.addBinding(MyObjects.OBJECT2).to(Object2.class);
ensuite dans les méthodes injectées:
@Inject void setSomeInterface(Map<MyObjects, SomeInterface> map) {
SomeInterface object1 = map.get(MyObjects.OBJECT1);
...
}
merci pour la réponse. Si je comprends bien, la première option est plus appropriée lorsque la classe réelle est connue au moment de la compilation, tandis que la seconde option permet de décider à l'exécution quelle implémentation utiliser. –