Wicketdependency injection

我在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注入到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的dependency injection愉快地注入RegistrationForm ,然后在RegistrationPage中使用add(new RegistrationForm())创建它;

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内,请记住将其声明为静态! 你很可能不需要任何对封闭类的引用。

在我看来,关于Wicket的DI有一个令人困惑的元素,在组件或页面上自动完成,但在模型中没有。 在我看来,模型(但不是页面)应该依赖于JPA等。

官方文档说要使用InjectorHolder.getInjector().inject(this)