我在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();
}
}
}
我不喜欢将RegistrationService仅注入需要它的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还是很陌生,所以不确定什么是规范-有人可以向我展示指导思想吗?:)
wicket + ioc的基本范例是:大多数依赖项应该通过setter注入来注入。WebPage无法进行构造函数注入。
组件/面板/表格/页面仅应在接收端。
因此,将依赖项RegistrationService
愉快地注入RegistrationForm
,然后在RegistrationPage中使用add(new RegistrationForm())创建它;
小门有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内部,请记住将其声明为静态!您很可能不需要对封闭类的任何引用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句