Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gwt 使用Gin/Guice注入实例_Gwt_Dependency Injection_Guice_Gwt Gin - Fatal编程技术网

Gwt 使用Gin/Guice注入实例

Gwt 使用Gin/Guice注入实例,gwt,dependency-injection,guice,gwt-gin,Gwt,Dependency Injection,Guice,Gwt Gin,我的GWT项目中通常有这种代码模式: Menu errorMenu = new Menu(user, userController, -1); Menu searchMenu = new Menu(user, userController, 0); errorView.setMenu(errorMenu); searchView.setMenu(searchMenu); 如何使用Gin/Guice在ErrorView和其他“视图”中插入菜单实例: public ErrorView impl

我的GWT项目中通常有这种代码模式:

Menu errorMenu = new Menu(user, userController, -1);
Menu  searchMenu = new Menu(user, userController, 0);

errorView.setMenu(errorMenu);
searchView.setMenu(searchMenu);
如何使用Gin/Guice在
ErrorView
和其他“视图”中插入
菜单
实例:

public ErrorView implements View {
 // Inject menu instance here
 private Menu menu;
}
这样,我就不必手动创建和设置对象了


同样对于
菜单
类,如何注入“user”和“userController”对象,这样我就不必在每次实例化菜单实例时都将其传递给每个菜单实例

在本教程的帮助下,您的问题看起来并不那么难。要将菜单实例注入到视图中,应该执行几个步骤

  • 将@Inject注释添加到菜单字段

    public ErrorView implements View {
    
      @Inject
      private Menu menu;
    }
    
    public SearchView implements View {
    
      @Inject
      private Menu menu;
    }
    
    但在这种情况下,在视图对象初始化期间(在构造函数中),菜单字段将为空。因此,我更喜欢将此字段添加到构造函数参数中

    public ErrorView implements View {
    
      private final Menu menu;
    
      @Inject
      public ErrorView(Menu menu) {
        this.menu = menu;
      }
    }
    
    public SearchView implements View {
    
      private final Menu menu;
    
      @Inject
      public SearchView(Menu menu) {
        this.menu = menu;
      }
    }
    
    当然,如果在ErrorView的构造函数中有许多其他参数,那么它将不起作用,因为所有这些参数都需要被注入

  • 现在我们必须确保GIN知道ErrorView中的菜单字段应该是 注入
    新菜单(用户,用户控制器,-1)
    和中的另一个 搜索查看到-
    新菜单(用户、用户控制器、0)
    。我们可以做到 通过以下几种方式:

    • 将注释
      @Named(“searchMenu”)
      @Named(“errorMenu”)
      添加到菜单字段中

      public ErrorView implements View {
      
        @Inject
        @Named("errorMenu")
        private Menu menu;
      }
      

      在GIN模块中,您应该提供此注释的定义

          public class ApplicationGinModule extends AbstractGinModule {
      
            protected void configure() {
              bind(Menu.class).annotatedWith(Names.named("errorMenu")).to(DefaultErrorMenu.class);
              bind(Menu.class).annotatedWith(Names.named("searchMenu")).to(DefaultSearchMenu.class);
      
              //assume that User and UserController classes have default constructors  
              //otherwise you should provide correct injection depending on your business-logic
              bind(User.class).in(Singleton.class); 
              bind(UserController.class).in(Singleton.class);  
            }
          }
      
          public class DefaultErrorMenu extends Menu {
      
            @Inject
            public DefaultErrorMenu(User user, UserController userController) {
              super(user, userController, -1);
            }
          }
      
          public class DefaultSearchMenu extends Menu {
      
            @Inject
            public DefaultSearchMenu(User user, UserController userController) {
              super(user, userController, 0);
            }
          }
      
    • 为菜单字段创建自己的注释
      @SearchMenu
      @ErrorMenu
      ,并在模块中定义它们

      注释示例:

      @Retention(RetentionPolicy.RUNTIME)
      @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD, ElementType.TYPE})
      @BindingAnnotation
      public @interface ErrorMenu {
      }
      
      用法:

      public ErrorView implements View {
      
        @Inject
        @ErrorMenu
        private Menu menu;
      }
      

      然后按照定义@Named(“ErrorMenu”)的方式定义注释:


  • 在某些示例中,我将菜单字段设为final并删除setter,但如果您确实需要菜单的可变状态,则可以将其保持不变。

    因为在我的应用程序中只有一个User和UserController实例,所以有没有办法在“public class DefaultErrorMenu extends menu”中也插入它用户和用户控制器也被注入了吗?在我的控制器类中,我通常有这样的模式:XyzController(最终应用程序,最终xyzmodel模型)用户和用户控制器对象将被注入,如果:1)它们有没有参数的默认构造函数,2)它们有@Inject注释,它们在您的GinModule类中有描述:bind(User.class)。somethingelse…..我不明白它是什么模式?无论如何,您应该将@Inject注释添加到XyzController类的构造函数中。顺便说一句,我也修改了这段代码来注入我的应用程序模型,但是当访问使用绑定(UserModel.class)注入@Inject和绑定的模型时,它会抛出NullPointerException;
    public ErrorView implements View {
    
      @Inject
      @ErrorMenu
      private Menu menu;
    }
    
    public ErrorView implements View {
    
      private final Menu menu;
    
      @Inject
      public ErrorView(@ErrorMenu Menu menu) {
        this.menu = menu;
      }
    } 
    
    bind(Menu.class).annotatedWith(ErrorMenu.class).to(DefaultErrorMenu.class);