java - Wicket 口依赖注入(inject)

标签 java dependency-injection wicket guice

我在 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/

相关文章:

java - n 位的二进制置换表示的时间复杂度

c# - 自动生成接口(interface)的实现(没有类的代理)

java - Wicket - AjaxFormComponentUpdatingBehavior 和退格键

java - Wicket Junit 测试用例

java - 使用 jpa 出现 NoViableAltException

java - 具有两次 orderByChild 条件的 Firebase 查询

java - 嵌套循环错误 - java

java - 即使在运行时请求许可后,也会出现误报 lint 许可错误

java - Scala 中的 Jersey 2.x @Context/依赖注入(inject)

java - 如何在 Spring @Service 和非 Spring 对象之间集成?