GinMapBinder
vous permet de construire progressivement une liaison à un java.util.Map
, donc la façon de utilisation il est d'obtenir un Map
injecté dans votre objet. Vous trouverez un exemple complet dans Guice's MapBinder
javadoc, GinMapBinder
fonctionne de la même manière.
Pour répondre à vos questions:
Est-ce la voie à suivre et résoudre mes problèmes?
Il pourrait: si vous injectez un Map<String, Provider<MyView>>
avec les clés étant rôle de l'utilisateur. Si vous n'avez que deux rôles de ce type, vous pouvez également injecter deux Provider
s et choisir celui qui correspond à get()
en fonction du rôle de l'utilisateur. (voir aussi ci-dessous)
Ce n'est pas comme ça que je le ferais. Je préfère utiliser une combinaison de deferred-binding (pour générer des permutations distinctes pour les utilisateurs normaux et admin), avec un fournisseur de propriété pour choisir la bonne permutation à l'exécution, et dynamic host page (pour transmettre les informations d'administration du serveur au client avant le le client démarre).
Vous utiliseriez la liaison différée pour choisir le Ginjector à utiliser (en utilisant les règles en usine et <replace-with>
); Les ginjecteurs seraient identiques (mêmes méthodes, héritées d'une interface de base) à l'exception du @GinModules
; et ainsi vous pouvez avoir un GinModule
pour les utilisateurs normaux et un autre pour admin les utilisateurs, liant chacun le MyView.class
à une classe d'implémentation distincte. Quelqu'un peut-il donner un exemple expliquant comment l'utiliser et comment sélectionner les différentes injections au moment de l'exécution?
construire une carte de liaison des rôles d'utilisateur pour afficher les mises en œuvre:
GinMapBinder<String, MyView> mapBinder =
GinMapBinder.newMapBinder(binder(), String.class, MyView.class);
mapBinder.addBinding("normal").to(MyViewImplNormal.class);
mapBinder.addBinding("admin").to(MyViewImplAdmin.class);
injecter Ensuite, ainsi que le rôle de l'utilisateur:
@Inject MyPresenter(@Named("user.role") String userRole,
Map<String, Provider<MyView>> views) {
et choisir la vue appropriée en fonction du rôle de l'utilisateur:
// TODO: handle the case where the map has no value for the user role
this.view = views.get(userRole).get();
…
L'alternative Je parlais de:
bind(MyView.class).annotatedWith(named("user.normal")).to(MyViewImplNormal.class);
bind(MyView.class).annotatedWith(named("user.admin")).to(MyViewImplAdmin.class);
…
@Inject MyPresenter(@Named("user.isAdmin") boolean isAdmin,
@Named("user.normal") Provider<MyView> normalView,
@Named("user.admin") Provider<MyView> adminView) {
this.view = isAdmin ? adminView.get() : normalView.get();
…