4

我在 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 很陌生,所以不确定规范是什么——有人可以给我指路明灯吗?:)

4

2 回答 2

3

wicket+ioc 的基本范式是:大多数依赖项应该通过 setter 注入来注入。对于网页,构造函数注入是不可能的。

组件/面板/表单/页面应该只在接收端。

因此,将依赖项RegistrationService愉快地注入到 中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 中,请记住将其声明为静态!您很可能不需要对封闭类的任何引用。

于 2009-03-19T21:20:46.337 回答
0

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

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

于 2015-09-03T16:14:45.073 回答