2009-02-18 330 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)