Wicket依赖注入
我有一个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很陌生,不确定这个标准是什么 - 有人能让我看到指引性的灯光吗? :)
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();
}
}
}
,记得要声明它的静态!你很可能不需要任何对封闭类的引用。
在我看来,Wicket上的DI有一个令人困惑的元素,在组件或页面上自动完成,但在模型中没有。在我看来正是模型(而不是页面)应该依赖于JPA等
官方文档说使用InjectorHolder.getInjector().inject(this)
尼斯一个安德烈亚斯,这正是我之后。我没有意识到IComponentInstantiationListener。 – tddmonkey 2009-03-20 09:40:59