-
05-09-2019 - |
题
我有一个网页,在检票一种形式,形式要求合作者,以获取其完成工作。合作者注入(为此我使用吉斯),看起来是这样的:
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。我是很新的检票口,从而不能确定的标准是什么 - 有人可以告诉我的指路明灯? :)
解决方案
与检票口+ IOC的基本模式是:大多数依赖应通过setter注入被注入。构造注射网页是不可能的。
部件/面板/形式/网页应仅是对recieving端。
所以,注入的依赖性愉快地RegistrationService
入RegistrationForm
,然后用添加RegistrationPage创建它(新RegistrationForm());
便门具有IComponentInstantiationListener - 它们中的一个是吉斯。他们每个部件/网页的构造过程中得到通知。所以你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,记得要声明它的静态!你很可能并不需要封闭类的任何引用。
其他提示
在上检票我看来DI具有一个令人困惑的元件,对元件或页面而不是在模型自动地完成的。在我看来正是模型(而不是页面)应该依赖于JPA等。
官方文档说使用InjectorHolder.getInjector().inject(this)