Wicket依赖注入

时间:2009-02-18 15:40:21

标签: java dependency-injection wicket guice

我在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();
        }
    }
}

我不喜欢RegisterService注册到RegistrationPage的想法,因为它只是需要它的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很陌生,所以不确定规范是什么 - 有人能告诉我引导光吗? :)

2 个答案:

答案 0 :(得分:3)

使用wicket + ioc的基本范例是:大多数依赖项应该通过setter注入注入。 WebPages不可能构造函数注入。

组件/面板/表格/页面应仅在接收端。

所以,将依赖项RegistrationService愉快地注入RegistrationForm,然后使用add(new RegistrationForm())在RegistrationPage中创建它;

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

答案 1 :(得分:0)

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

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