2009-02-18 331 views
4

我有一個Wicket窗體的頁面,表單需要合作者完成其工作。合作者注入(爲此我使用的吉斯),看起來是這樣的:Wicket依賴注入

​​

我不喜歡這個想法,RegistrationService注入RegistrationPage時,它只是需要它的RegistrationForm。我可以改變RegistrationForm接收RegistrationService:

public RegistrationForm(RegistrationService service) { 
    this.service = service; 
} 

,並從RegistrationPage刪除該字段,但RegistrationPage仍在使用直通做。

我想我問的是最好的做法是做什麼?這是確定的事情,或者它或許會是更好地RegistrationForm自身注入到頁:

public class RegistrationPage extends WebPage { 
     @Inject 
     public RegistrationPage(RegistrationForm form) { 
      add(form); 
     } 
    } 

    --- 

    private class RegistrationForm extends Form { 
     private RegistrationService service; 

     @Inject 
     public RegistrationForm(RegistrationService service) { 
      this.service = service; 
     } 

     protected void onSubmit() { 
      service.doSomething(); 
     } 
    } 

我喜歡這個,因爲我想有一個單獨的類/文件RegistrationForm。我對Wicket很陌生,不確定這個標準是什麼 - 有人能讓我看到指引性的燈光嗎? :)

回答

3

wicket + ioc的基本範例是:大多數依賴項應通過setter注入來注入。 WebPages不可能使用構造器注入。

組件/面板/表單/頁面只應在接收端。

所以,注入依賴到RegistrationService愉快地進入RegistrationForm,然後創建它在RegistrationPage中添加(新的RegistrationForm());

wicket has IComponentInstantiationListener - 其中之一是guice。他們會在每個組件/網頁的構造函數中得到通知。所以你的RegistrationForm將在你的代碼的任何部分執行之前注入它的依賴關係。

的方式,我會做到這一點: (當然RegistrationForm可以在另一個文件)

如果你決定把RegistrationForm在頁面內的內部類
public class RegistrationPage extends WebPage { 

@Inject 
public RegistrationPage() { 
    add(new RegistrationForm());    
} 

--- 
private static class RegistrationForm extends Form { 
    RegistrationService service; 

     @Inject 
    public void setRegistrationService (RegistrationService service){ 
    this.service = service; 
     } 
    public RegistrationForm() { 
     // setup 
    } 

    protected void onSubmit() { 
     service.doSomething(); 
    } 
} 
} 

,記得要聲明它的靜態!你很可能不需要任何對封閉類的引用。

+0

尼斯一個安德烈亞斯,這正是我之後。我沒有意識到IComponentInstantiationListener。 – tddmonkey 2009-03-20 09:40:59

0

在我看來,Wicket上的DI有一個令人困惑的元素,在組件或頁面上自動完成,但在模型中沒有。在我看來正是模型(而不是頁面)應該依賴於JPA等

官方文檔說使用InjectorHolder.getInjector().inject(this)