0

我们有一个使用 GWT、MVP 范式和 Gin 的项目。我们有一个演示者,但现在我想要不同的视图(一个用于普通用户,一个用于管理员,管理员看到的几乎相同,除了一个额外的列和不同的文本)。问题是我想选择我想在运行时使用的视图,因为只有这样我才知道用户级别。

我找到了GinMapBinder,它似乎可以满足我的要求。代码中有一个关于如何实例化它的示例,但没有说明如何使用它。

所以我的问题是:这是解决我的问题的方法吗?谁能举例说明如何使用它以及如何在运行时选择不同的注入?

4

1 回答 1

3

GinMapBinder允许您逐步构建到 a 的绑定java.util.Map,因此使用它的方法是将 aMap注入到您的对象中。您将在Guice 的MapBinderjavadoc中找到一个完整的示例,GinMapBinder其工作方式相同。

要回答您的问题:

这是解决我的问题的方法吗?

它可以:如果你注入一个Map<String, Provider<MyView>>作为用户角色的键。如果您只有两个这样的角色,您也只需注入两个Providers,并get()根据用户的角色选择一个。(另见下文)

不过,我不会那样做。我宁愿结合使用延迟绑定(为普通用户和管理员用户生成不同的排列),使用属性提供者在运行时选择正确的排列,以及动态主机页面(将管理信息从服务器传递到客户端启动之前的客户端)。
您将使用延迟绑定来选择要使用的 Ginjector(使用工厂<replace-with>规则);Ginjectors 将是相同的(相同的方法,从基本接口继承),除了@GinModules; 因此您可以GinModule普通用户设置一个,为管理员用户设置另一个,每个都绑定MyView.class到一个不同的实现类。

谁能举例说明如何使用它以及如何在运行时选择不同的注入?

构建映射绑定用户角色以查看实现:

GinMapBinder<String, MyView> mapBinder =
    GinMapBinder.newMapBinder(binder(), String.class, MyView.class);
mapBinder.addBinding("normal").to(MyViewImplNormal.class);
mapBinder.addBinding("admin").to(MyViewImplAdmin.class);

然后将其与用户角色一起注入:

@Inject MyPresenter(@Named("user.role") String userRole,
    Map<String, Provider<MyView>> views) {

并根据用户的角色选择合适的视图:

  // TODO: handle the case where the map has no value for the user role
  this.view = views.get(userRole).get();
  …

我正在谈论的替代方案:

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();
  …
于 2013-08-21T10:30:59.270 回答