我在Wicket有一个带有表单的页面,其中表单需要协作者完成其工作。注入了合作者(我正在使用Guice),看起来像是:
public class RegistrationPage extends WebPage {
@Inject
public RegistrationPage(RegistrationService service) {
this.service = service;
add(new RegistrationForm());
}
private class RegistrationForm extends Form {
public RegistrationForm() {
// setup
}
protected void onSubmit() {
service.doSomething();
}
}
}
我不喜欢RegisterService注册到RegistrationPage的想法,因为它只是需要它的RegistrationForm。我可以更改RegistrationForm以接收RegistrationService:
public RegistrationForm(RegistrationService service) {
this.service = service;
}
并从RegistrationPage中删除该字段,但仍然使用RegistrationPage进行传递。
我想我要问的是这样做的最佳做法是什么?这样做是否可行,或者将RegistrationForm本身注入Page:
可能更好 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很陌生,所以不确定规范是什么 - 有人能告诉我引导光吗? :)
答案 0 :(得分:3)
组件/面板/表格/页面应仅在接收端。
所以,将依赖项RegistrationService
愉快地注入RegistrationForm
,然后使用add(new RegistrationForm())在RegistrationPage中创建它;
wicket有IComponentInstantiationListener - 其中一个是guice。他们会在每个组件/网页的构造函数中得到通知。因此,在代码的任何部分可以执行之前,您的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();
}
}
}
如果您决定将RegistrationForm作为内部类放在Page内,请记住将其声明为静态!你很可能不需要任何对封闭类的引用。
答案 1 :(得分:0)
在我看来,关于Wicket的DI有一个令人困惑的元素,在组件或页面上自动完成,但在模型中没有。在我看来,模型(但不是页面)应该依赖于JPA等。
官方文件说使用InjectorHolder.getInjector().inject(this)