2013-08-21 1 views
0

Nous avons un projet où nous utilisons GWT, avec le paradigme MVP, et Gin. Nous avons un présentateur, mais maintenant je veux avoir des vues différentes (une pour les utilisateurs normaux, et une pour l'administrateur, qui voit presque la même chose, sauf pour une colonne supplémentaire et des textes différents). Le problème est que je veux sélectionner la vue que je veux utiliser lors de l'exécution, parce que seulement alors je connais le niveau d'utilisateur. J'ai trouvé le GinMapBinder, qui semble faire ce que je veux. Dans le code est un exemple sur la façon de l'instancier, mais pas sur la façon de l'utiliser.Comment utiliser le GinMapBinder

Donc, mes questions: Est-ce la voie à suivre pour résoudre mes problèmes? Quelqu'un peut-il donner un exemple expliquant comment l'utiliser et comment sélectionner les différentes injections à l'exécution?

Répondre

3

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