我在 Wicket 中有一个带有表单的页面,该表单需要协作者才能完成其工作。合作者被注入(inject)(我正在使用 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 注入(inject)到 RegistrationPage 而只是 RegistrationForm 需要它的想法。我可以更改 RegistrationForm 以接收 RegistrationService:
public RegistrationForm(RegistrationService service) {
this.service = service;
}
并从 RegistrationPage 中删除该字段,但 RegistrationPage 仍用于执行传递。
我想我想问的是执行此操作的最佳做法是什么?这样可以吗,或者将 RegistrationForm 本身注入(inject)页面可能会更好:
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 注入(inject)来注入(inject)。网页不可能进行构造函数注入(inject)。
组件/面板/表单/页面应该只在接收端。
因此,将对 RegistrationService
的依赖注入(inject)到 RegistrationForm
中,然后在 RegistrationPage 中使用 add(new RegistrationForm()); 创建它
wicket 有 IComponentInstantiationListener - 其中之一是 guice。他们在每个组件/网页的构造函数中得到通知。因此,您的 RegistrationForm 将在您的代码的任何部分执行之前注入(inject)其依赖项。
我会这样做的方式: (当然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 中,请记住将其声明为静态的!您很可能不需要对封闭类的任何引用。
关于java - Wicket 口依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/561578/