2012-05-01 82 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