2012-05-01 42 views
3

我通常有这样的代码模式在我的GWT项目实例:注射用杜松子酒/吉斯

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

errorView.setMenu(errorMenu); 
searchView.setMenu(searchMenu); 

如何在ErrorView等“意见”注入Menu实例使用GIN /吉斯:

public ErrorView implements View { 
// Inject menu instance here 
private Menu menu; 
} 

这样,我不必手动创建和设置对象?

同样对于Menu类,我怎样才能注入“user”和“userController”对象,所以我不必在每次实例化它时在每个Menu实例上传递它。

+0

由于在我的应用程序中只有一个User和UserController实例,所以还有一种方法可以注入它 – xybrek

回答

10

在本教程的帮助下http://code.google.com/p/google-gin/wiki/GinTutorial您的问题看起来并不困难。您应该运行几个步骤将菜单实例注入到视图中。

  1. 将@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; 
        } 
    } 
    

    Ofcourse它不会在工作的情况下,你必须在ErrorView的构造许多其它参数,因为所有的人都需要注入为好。

  2. 现在,我们必须确保GIN知道在ErrorView该菜单字段应该 注入new Menu(user, userController, -1)和另一位在 搜索查看到 - new Menu(user, userController, 0)。我们可以通过几种方式做到这一点 :

    • 添加注释@Named("searchMenu")@Named("errorMenu")到您的菜单领域。

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

      public ErrorView implements View { 
      
          private final Menu menu; 
      
          @Inject 
          public ErrorView(@Named("errorMenu") Menu menu) { 
          this.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; 
      } 
      

      public ErrorView implements View { 
      
          private final Menu menu; 
      
          @Inject 
          public ErrorView(@ErrorMenu Menu menu) { 
          this.menu = menu; 
          } 
      } 
      

      然后定义注释的方式究竟如何定义@Named( “ErrorMenu”):

      bind(Menu.class).annotatedWith(ErrorMenu.class).to(DefaultErrorMenu.class); 
      

在一些例子中我做菜单场决赛,并删除二传手它,但如果你真的需要可变状态菜单中,您可以将它保持不变。

+0

在“public class DefaultErrorMenu extends Menu”中注入了user和userController吗? – xybrek

+0

在我的控制器类中,我通常有以下模式:XyzController(最终应用程序应用程序,最终XyxModel模型) – xybrek

+0

user和userController对象将在以下情况下注入:1)它们具有不带参数的默认构造函数,2)它们具有@Inject注释,在你的GinModule类中描述:bind(User.class).somethingelse ..... – hsestupin